This commit is contained in:
Ryan Hitchman 2010-08-29 22:35:27 -05:00
parent ba565a3eaa
commit c2a607198c
12 changed files with 79 additions and 65 deletions

View File

@ -18,7 +18,7 @@ split_re = re.compile(r'([\d+-]*)d?(F|\d*)', re.I)
def nrolls(count, n):
"roll an n-sided die count times"
if n == "F":
return [random.randint(-1,1) for x in xrange(count)]
return [random.randint(-1, 1) for x in xrange(min(count, 100))]
if n < 2: # it's a coin
if count < 5000:
return [random.randint(0, 1) for x in xrange(count)]
@ -38,13 +38,15 @@ def nrolls(count, n):
def dice(inp):
".dice <diceroll> -- simulates dicerolls, e.g. .dice 2d20-d5+4 roll 2 " \
"D20s, subtract 1D5, add 4"
desc = None
try: # if inp is a re.match object...
try: # if inp is a re.match object...
(inp, desc) = inp.groups()
except AttributeError:
pass # we got called via hook.command, inp is already the roll
if desc == None: (inp, desc) = valid_diceroll_re.match(inp).groups()
if "d" not in inp: return
(inp, desc) = valid_diceroll_re.match(inp).groups()
if "d" not in inp:
return
spec = whitespace_re.sub('', inp)
if not valid_diceroll_re.match(spec):
return "Invalid diceroll"
@ -56,7 +58,7 @@ def dice(inp):
for roll in groups:
count, side = split_re.match(roll).groups()
count = int(count) if count not in " +-" else 1
if side.upper() == "F": # fudge dice are basically 1d3-2
if side.upper() == "F": # fudge dice are basically 1d3-2
for fudge in nrolls(count, "F"):
if fudge == 1:
rolls.append("\x033+\x0F")

View File

@ -37,14 +37,13 @@ def google(inp):
result = parsed['responseData']['results'][0]
title = result['titleNoFormatting']
content = result['content']
content = result['content']
if len(content) == 0:
content = "No description available"
content = "No description available"
else:
content = http.html.fromstring(content).text_content()
content = http.html.fromstring(content).text_content()
out = '%s -- \x02%s\x02: "%s"' % (result['unescapedUrl'], title, content)
out = ' '.join(out.split())

View File

@ -4,6 +4,7 @@ from util import hook, http
thread_re = r"(?i)forums\.somethingawful\.com/\S+threadid=(\d+)"
showthread = "http://forums.somethingawful.com/showthread.php?noseen=1"
def login(user, password):
http.jar.clear_expired_cookies()
if any(cookie.domain == 'forums.somethingawful.com' and
@ -13,7 +14,7 @@ def login(user, password):
return
assert("malformed cookie jar")
http.get("http://forums.somethingawful.com/account.php", cookies=True,
post_data="action=login&username=%s&password=%s" % (user, password))
post_data="action=login&username=%s&password=%s" % (user, password))
@hook.regex(thread_re)

View File

@ -62,4 +62,5 @@ def tv_next(inp):
if len(next_eps) == 1:
return "the next episode of %s airs %s" % (series_name, next_eps[0])
else:
return "the next episodes of %s: %s" % (series_name, ", ".join(next_eps))
next_eps = ', '.join(next_eps)
return "the next episodes of %s: %s" % (series_name, next_eps)

View File

@ -122,7 +122,7 @@ def twitter(inp):
reply_user = tweet.find(reply_user).text
if reply_name is not None and (reply_id is not None or
reply_user is not None):
add_reply(reply_name, reply_id if reply_id else -1)
add_reply(reply_name, reply_id or -1)
time = strftime('%Y-%m-%d %H:%M:%S',
strptime(time.text,

View File

@ -23,13 +23,16 @@ inspired by:
__license__ = "Python"
import re, unicodedata, urlparse
import re
import unicodedata
import urlparse
from urllib import quote, unquote
default_port = {
'http': 80,
}
class Normalizer(object):
def __init__(self, regex, normalize_func):
self.regex = regex
@ -43,78 +46,86 @@ normalizers = ( Normalizer( re.compile(r'(?:https?://)?(?:[a-zA-Z0-9\-]+\.)?(?:a
lambda m: r'http://youtube.com/watch?v=%s' % m.group(1) ),
)
def normalize(url):
"""Normalize a URL."""
scheme, auth, path, query, fragment = urlparse.urlsplit(url.strip())
userinfo, host, port=re.search('([^@]*@)?([^:]*):?(.*)', auth).groups()
userinfo, host, port = re.search('([^@]*@)?([^:]*):?(.*)', auth).groups()
# Always provide the URI scheme in lowercase characters.
scheme = scheme.lower()
# Always provide the host, if any, in lowercase characters.
host = host.lower()
if host and host[-1] == '.': host = host[:-1]
if host and host[-1] == '.':
host = host[:-1]
if host and host.startswith("www."):
if not scheme: scheme = "http"
if not scheme:
scheme = "http"
host = host[4:]
elif path and path.startswith("www."):
if not scheme: scheme = "http"
if not scheme:
scheme = "http"
path = path[4:]
# Only perform percent-encoding where it is essential.
# Always use uppercase A-through-F characters when percent-encoding.
# All portions of the URI must be utf-8 encoded NFC from Unicode strings
def clean(string):
string=unicode(unquote(string), 'utf-8', 'replace')
string = unicode(unquote(string), 'utf-8', 'replace')
return unicodedata.normalize('NFC', string).encode('utf-8')
path=quote(clean(path), "~:/?#[]@!$&'()*+,;=")
fragment=quote(clean(fragment), "~")
path = quote(clean(path), "~:/?#[]@!$&'()*+,;=")
fragment = quote(clean(fragment), "~")
# note care must be taken to only encode & and = characters as values
query="&".join(["=".join([quote(clean(t), "~:/?#[]@!$'()*+,;=")
query = "&".join(["=".join([quote(clean(t), "~:/?#[]@!$'()*+,;=")
for t in q.split("=", 1)]) for q in query.split("&")])
# Prevent dot-segments appearing in non-relative URI paths.
if scheme in ["", "http", "https", "ftp", "file"]:
output=[]
output = []
for input in path.split('/'):
if input=="":
if not output: output.append(input)
elif input==".":
if input == "":
if not output:
output.append(input)
elif input == ".":
pass
elif input=="..":
if len(output)>1: output.pop()
elif input == "..":
if len(output) > 1:
output.pop()
else:
output.append(input)
if input in ["", ".", ".."]: output.append("")
path='/'.join(output)
if input in ["", ".", ".."]:
output.append("")
path = '/'.join(output)
# For schemes that define a default authority, use an empty authority if
# the default is desired.
if userinfo in ["@", ":@"]: userinfo=""
if userinfo in ["@", ":@"]:
userinfo = ""
# For schemes that define an empty path to be equivalent to a path of "/",
# use "/".
if path=="" and scheme in ["http", "https", "ftp", "file"]:
path="/"
if path == "" and scheme in ["http", "https", "ftp", "file"]:
path = "/"
# For schemes that define a port, use an empty port if the default is
# desired
if port and scheme in default_port.keys():
if port.isdigit():
port=str(int(port))
if int(port)==default_port[scheme]:
port = str(int(port))
if int(port) == default_port[scheme]:
port = ''
# Put it all back together again
auth=(userinfo or "") + host
auth = (userinfo or "") + host
if port:
auth+=":"+port
auth += ":" + port
if url.endswith("#") and query == "" and fragment == "":
path += "#"
normal_url = urlparse.urlunsplit((scheme, auth, path, query, fragment)).replace(
"http:///", "http://")
normal_url = urlparse.urlunsplit((scheme, auth, path, query,
fragment)).replace("http:///", "http://")
for norm in normalizers:
m = norm.regex.match(normal_url)
if m: