My hands are typing words
parent
5cfa4bc158
commit
606d7e163d
26
admin.py
26
admin.py
|
@ -2,19 +2,19 @@
|
||||||
"""
|
"""
|
||||||
admin.py - Phenny Admin Module
|
admin.py - Phenny Admin Module
|
||||||
Copyright 2008-9, Sean B. Palmer, inamidst.com
|
Copyright 2008-9, Sean B. Palmer, inamidst.com
|
||||||
Modified by Sfan5 2013
|
Modified by sfan5 2013
|
||||||
Licensed under the Eiffel Forum License 2.
|
Licensed under the Eiffel Forum License 2.
|
||||||
|
|
||||||
http://inamidst.com/phenny/
|
http://inamidst.com/phenny/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def join(phenny, input):
|
def join(phenny, input):
|
||||||
"""Join the specified channel. This is an admin-only command."""
|
"""Join the specified channel. This is an admin-only command."""
|
||||||
# Can only be done in privmsg by an admin
|
# Can only be done in privmsg by an admin
|
||||||
if input.sender.startswith('#'): return
|
if input.sender.startswith('#'): return
|
||||||
if input.admin:
|
if input.admin:
|
||||||
channel, key = input.group(1), input.group(2)
|
channel, key = input.group(1), input.group(2)
|
||||||
if not key:
|
if not key:
|
||||||
phenny.write(['JOIN'], channel)
|
phenny.write(['JOIN'], channel)
|
||||||
else: phenny.write(['JOIN', channel, key])
|
else: phenny.write(['JOIN', channel, key])
|
||||||
join.rule = r'\!join (#\S+)(?: *(\S+))?'
|
join.rule = r'\!join (#\S+)(?: *(\S+))?'
|
||||||
|
@ -22,11 +22,11 @@ join.rule = r'\!join (#\S+)(?: *(\S+))?'
|
||||||
join.priority = 'low'
|
join.priority = 'low'
|
||||||
join.example = '.join #example or .join #example key'
|
join.example = '.join #example or .join #example key'
|
||||||
|
|
||||||
def part(phenny, input):
|
def part(phenny, input):
|
||||||
"""Part the specified channel. This is an admin-only command."""
|
"""Part the specified channel. This is an admin-only command."""
|
||||||
# Can only be done in privmsg by an admin
|
# Can only be done in privmsg by an admin
|
||||||
if input.sender.startswith('#'): return
|
if input.sender.startswith('#'): return
|
||||||
if input.admin:
|
if input.admin:
|
||||||
if ' ' in input.group(2):
|
if ' ' in input.group(2):
|
||||||
arg = input.group(2).split(" ")
|
arg = input.group(2).split(" ")
|
||||||
arg2 = ' '.join(arg[1:])
|
arg2 = ' '.join(arg[1:])
|
||||||
|
@ -38,11 +38,11 @@ part.commands = ['part']
|
||||||
part.priority = 'low'
|
part.priority = 'low'
|
||||||
part.example = '.part #example'
|
part.example = '.part #example'
|
||||||
|
|
||||||
def quit(phenny, input):
|
def quit(phenny, input):
|
||||||
"""Quit from the server. This is an owner-only command."""
|
"""Quit from the server. This is an owner-only command."""
|
||||||
# Can only be done in privmsg by the owner
|
# Can only be done in privmsg by the owner
|
||||||
if input.sender.startswith('#'): return
|
if input.sender.startswith('#'): return
|
||||||
if input.owner:
|
if input.owner:
|
||||||
phenny.write(['QUIT'])
|
phenny.write(['QUIT'])
|
||||||
__import__('os')._exit(0)
|
__import__('os')._exit(0)
|
||||||
quit.commands = ['quit']
|
quit.commands = ['quit']
|
||||||
|
@ -54,20 +54,20 @@ def quit2(phenny, input):
|
||||||
quit2.rule = ('$nick', 'quit')
|
quit2.rule = ('$nick', 'quit')
|
||||||
quit2.priority = 'low'
|
quit2.priority = 'low'
|
||||||
|
|
||||||
def msg(phenny, input):
|
def msg(phenny, input):
|
||||||
# Can only be done in privmsg by an admin
|
# Can only be done in privmsg by an admin
|
||||||
if input.sender.startswith('#'): return
|
if input.sender.startswith('#'): return
|
||||||
a, b = input.group(2), input.group(3)
|
a, b = input.group(2), input.group(3)
|
||||||
if (not a) or (not b): return
|
if (not a) or (not b): return
|
||||||
if input.admin:
|
if input.admin:
|
||||||
phenny.msg(a, b)
|
phenny.msg(a, b)
|
||||||
msg.rule = (['msg'], r'(#?\S+) (.+)')
|
msg.rule = (['msg'], r'(#?\S+) (.+)')
|
||||||
msg.priority = 'low'
|
msg.priority = 'low'
|
||||||
|
|
||||||
def me(phenny, input):
|
def me(phenny, input):
|
||||||
# Can only be done in privmsg by an admin
|
# Can only be done in privmsg by an admin
|
||||||
if input.sender.startswith('#'): return
|
if input.sender.startswith('#'): return
|
||||||
if input.admin:
|
if input.admin:
|
||||||
msg = '\x01ACTION %s\x01' % input.group(3)
|
msg = '\x01ACTION %s\x01' % input.group(3)
|
||||||
phenny.msg(input.group(2) or input.sender, msg)
|
phenny.msg(input.group(2) or input.sender, msg)
|
||||||
me.rule = (['me'], r'(#?\S+) (.+)')
|
me.rule = (['me'], r'(#?\S+) (.+)')
|
||||||
|
@ -79,5 +79,5 @@ def py(phenny, input):
|
||||||
py.commands = ['py']
|
py.commands = ['py']
|
||||||
py.priority = 'high'
|
py.priority = 'high'
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print __doc__.strip()
|
print __doc__.strip()
|
||||||
|
|
66
antiabuse.py
66
antiabuse.py
|
@ -10,14 +10,49 @@ antiabuse["ignorelist"] = []
|
||||||
antiabuse["cooldown_l"] = {}
|
antiabuse["cooldown_l"] = {}
|
||||||
antiabuse["cooldown"] = 3 # seconds
|
antiabuse["cooldown"] = 3 # seconds
|
||||||
|
|
||||||
|
def api_ignore(mask):
|
||||||
|
antiabuse["ignorelist"].append(mask)
|
||||||
|
db = sqlite3.connect("antiabuse.sqlite")
|
||||||
|
c = db.cursor()
|
||||||
|
c.execute("INSERT INTO ignore (nick) VALUES (?)", (mask,))
|
||||||
|
c.close()
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
def api_unignore(mask):
|
||||||
|
if not mask in antiabuse["ignorelist"]:
|
||||||
|
return
|
||||||
|
antiabuse['ignorelist'].remove(mask)
|
||||||
|
db = sqlite3.connect("antiabuse.sqlite")
|
||||||
|
c = db.cursor()
|
||||||
|
c.execute("DELETE FROM ignore WHERE nick = ?", (mask,))
|
||||||
|
c.close()
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
def api_get_ignorelist():
|
||||||
|
return antiabuse["ignorelist"]
|
||||||
|
|
||||||
|
class SomeObject(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
antiabuse_api = SomeObject()
|
||||||
|
antiabuse_api.ignore = api_ignore
|
||||||
|
antiabuse_api.unignore = api_unignore
|
||||||
|
antiabuse_api.get_ignorelsit = api_get_ignorelist
|
||||||
|
|
||||||
|
_export = {
|
||||||
|
'antiabuse': antiabuse_api,
|
||||||
|
}
|
||||||
|
|
||||||
def aa_hook(phenny, input, func):
|
def aa_hook(phenny, input, func):
|
||||||
if input.admin or input.owner:
|
if input.admin or input.owner:
|
||||||
return False
|
return True
|
||||||
|
|
||||||
# Ignore list
|
# Ignore list
|
||||||
for entry in antiabuse["ignorelist"]:
|
for entry in antiabuse["ignorelist"]:
|
||||||
if phenny.match_hostmask(entry, input.hostmask):
|
if phenny.match_hostmask(entry, input.hostmask):
|
||||||
return True # abort command
|
return False # abort command
|
||||||
|
|
||||||
# Cooldown
|
# Cooldown
|
||||||
if input.nick in antiabuse["cooldown_l"]:
|
if input.nick in antiabuse["cooldown_l"]:
|
||||||
|
@ -26,10 +61,10 @@ def aa_hook(phenny, input, func):
|
||||||
ot = 0
|
ot = 0
|
||||||
antiabuse["cooldown_l"][input.nick] = time.time()
|
antiabuse["cooldown_l"][input.nick] = time.time()
|
||||||
if antiabuse["cooldown_l"][input.nick] - antiabuse["cooldown"] < ot:
|
if antiabuse["cooldown_l"][input.nick] - antiabuse["cooldown"] < ot:
|
||||||
return True # abort command
|
return False # abort command
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return False
|
return True
|
||||||
|
|
||||||
aa_hook.hook = True
|
aa_hook.hook = True
|
||||||
|
|
||||||
|
@ -49,13 +84,7 @@ def ignore(phenny, input):
|
||||||
if not input.admin:
|
if not input.admin:
|
||||||
return
|
return
|
||||||
arg = hmasktrans(input.group(2).strip())
|
arg = hmasktrans(input.group(2).strip())
|
||||||
antiabuse["ignorelist"].append(arg)
|
api_ignore(arg)
|
||||||
db = sqlite3.connect("antiabuse.sqlite")
|
|
||||||
c = db.cursor()
|
|
||||||
c.execute("INSERT INTO ignore (nick) VALUES (?)", (arg,))
|
|
||||||
c.close()
|
|
||||||
db.commit()
|
|
||||||
db.close()
|
|
||||||
phenny.reply("'%s' added to ignore list." % arg)
|
phenny.reply("'%s' added to ignore list." % arg)
|
||||||
|
|
||||||
ignore.commands = ['ignore']
|
ignore.commands = ['ignore']
|
||||||
|
@ -65,15 +94,7 @@ def unignore(phenny, input):
|
||||||
if not input.admin:
|
if not input.admin:
|
||||||
return
|
return
|
||||||
arg = hmasktrans(input.group(2).strip())
|
arg = hmasktrans(input.group(2).strip())
|
||||||
if not arg in antiabuse["ignorelist"]:
|
api_unignore(arg)
|
||||||
return
|
|
||||||
antiabuse['ignorelist'].remove(arg)
|
|
||||||
db = sqlite3.connect("antiabuse.sqlite")
|
|
||||||
c = db.cursor()
|
|
||||||
c.execute("DELETE FROM ignore WHERE nick = ?", (arg,))
|
|
||||||
c.close()
|
|
||||||
db.commit()
|
|
||||||
db.close()
|
|
||||||
phenny.reply("'%s' removed from ignore list." % arg)
|
phenny.reply("'%s' removed from ignore list." % arg)
|
||||||
|
|
||||||
unignore.commands = ['unignore']
|
unignore.commands = ['unignore']
|
||||||
|
@ -82,7 +103,10 @@ unignore.priority = 'high'
|
||||||
def listignore(phenny, input):
|
def listignore(phenny, input):
|
||||||
if not input.admin:
|
if not input.admin:
|
||||||
return
|
return
|
||||||
phenny.reply(', '.join(antiabuse['ignorelist']))
|
s = ', '.join(antiabuse['ignorelist'])
|
||||||
|
if s == "":
|
||||||
|
s = "Ignore list empty."
|
||||||
|
phenny.reply(s)
|
||||||
|
|
||||||
listignore.commands = ['listignore']
|
listignore.commands = ['listignore']
|
||||||
listignore.priority = 'high'
|
listignore.priority = 'high'
|
||||||
|
|
28
calc.py
28
calc.py
|
@ -8,6 +8,7 @@ Copyright 2014, sfan5
|
||||||
import math
|
import math
|
||||||
import random
|
import random
|
||||||
import struct
|
import struct
|
||||||
|
import multiprocessing
|
||||||
|
|
||||||
class SomeObject(object):
|
class SomeObject(object):
|
||||||
pass
|
pass
|
||||||
|
@ -39,11 +40,28 @@ def c(phenny, input):
|
||||||
q = input.group(2).encode('ascii', 'ignore')
|
q = input.group(2).encode('ascii', 'ignore')
|
||||||
if '__' in q:
|
if '__' in q:
|
||||||
return phenny.reply("Sorry, but no double underscores.")
|
return phenny.reply("Sorry, but no double underscores.")
|
||||||
print("[LOG]: %s calculated '%s'" % (input.nick, q))
|
log.log("event", "%s calculated '%s'" % (log.fmt_user(input), q), phenny)
|
||||||
try:
|
o = multiprocessing.Queue()
|
||||||
phenny.say(repr(eval(q, {'__builtins__': env}, {})))
|
def get_result(o, q):
|
||||||
except Exception as e:
|
try:
|
||||||
phenny.say(type(e).__name__ + ": " + str(e))
|
o.put(repr(eval(q, {'__builtins__': env}, {})))
|
||||||
|
except Exception as e:
|
||||||
|
o.put(type(e).__name__ + ": " + str(e))
|
||||||
|
proc = multiprocessing.Process(target=get_result, args=(o,q))
|
||||||
|
proc.start()
|
||||||
|
proc.join(2.0)
|
||||||
|
if proc.is_alive():
|
||||||
|
proc.terminate()
|
||||||
|
if 'math.pow' in q or '**' in q:
|
||||||
|
phenny.reply("Kindly go fuck yourself!")
|
||||||
|
antiabuse.ignore("*!*" + input.hostmask[input.hostmask.find("@"):])
|
||||||
|
log.log("action", "Auto-ignored %s for !c crash attempt" % log.fmt_user(input), phenny)
|
||||||
|
else:
|
||||||
|
phenny.reply("Took to long to calculate")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
phenny.say(o.get())
|
||||||
|
|
||||||
|
|
||||||
c.commands = ['c']
|
c.commands = ['c']
|
||||||
c.example = '.c 5 + 3'
|
c.example = '.c 5 + 3'
|
||||||
|
|
|
@ -131,12 +131,12 @@ def devwikipedia(term, language='en', last=False):
|
||||||
term = term.decode('utf-8').encode('utf-8')
|
term = term.decode('utf-8').encode('utf-8')
|
||||||
return sentence + ' - ' + (devwikiuri % (term))
|
return sentence + ' - ' + (devwikiuri % (term))
|
||||||
|
|
||||||
def devwik(phenny, input):
|
def devwik(phenny, input):
|
||||||
origterm = input.groups()[1]
|
origterm = input.groups()[1]
|
||||||
if not origterm:
|
if not origterm:
|
||||||
return phenny.say('Perhaps you meant "!devwik Zen"?')
|
return phenny.say('Perhaps you meant "!devwik Zen"?')
|
||||||
origterm = origterm.encode('utf-8')
|
origterm = origterm.encode('utf-8')
|
||||||
print("[LOG]: %s queried Minetest Dev Wiki for '%s'" % (input.nick,origterm))
|
log.log("event", "%s queried Devwiki for '%s'" % (log.fmt_user(input), origterm), phenny)
|
||||||
|
|
||||||
term = urllib.unquote(origterm)
|
term = urllib.unquote(origterm)
|
||||||
language = 'en'
|
language = 'en'
|
||||||
|
|
14
search.py
14
search.py
|
@ -10,8 +10,6 @@ http://inamidst.com/phenny/
|
||||||
|
|
||||||
import web, re
|
import web, re
|
||||||
|
|
||||||
search_badwords = ["porn","p0rn","pr0n","pron","redtube","sex","pussy","weed","smoking","drug","penis","vagina"] # Thank KikaRz, LandMine and RagnarLaud for this
|
|
||||||
|
|
||||||
class Grab(web.urllib.URLopener):
|
class Grab(web.urllib.URLopener):
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.version = 'Mozilla/5.0 (MinetestBot)'
|
self.version = 'Mozilla/5.0 (MinetestBot)'
|
||||||
|
@ -61,12 +59,8 @@ def g(phenny, input):
|
||||||
query = input.group(2)
|
query = input.group(2)
|
||||||
if not query:
|
if not query:
|
||||||
return phenny.reply('.g what?')
|
return phenny.reply('.g what?')
|
||||||
for bw in search_badwords:
|
|
||||||
if bw in query:
|
|
||||||
print("[LOG]: %s queried Google Result for '%s' | DENIED: Badword" % (input.nick,query))
|
|
||||||
return phenny.reply("Gross!")
|
|
||||||
query = query.encode('utf-8')
|
query = query.encode('utf-8')
|
||||||
print("[LOG]: %s queried Google Result for '%s'" % (input.nick,query))
|
log.log("%s searched Google for '%s'" % (log.fmt_user(input), query))
|
||||||
uri = google_search(query)
|
uri = google_search(query)
|
||||||
if uri:
|
if uri:
|
||||||
phenny.reply(uri)
|
phenny.reply(uri)
|
||||||
|
@ -81,12 +75,8 @@ def gc(phenny, input):
|
||||||
if not input.group(2):
|
if not input.group(2):
|
||||||
return phenny.reply("No query term.")
|
return phenny.reply("No query term.")
|
||||||
query = input.group(2).encode('utf-8')
|
query = input.group(2).encode('utf-8')
|
||||||
|
log.log("%s searched Google for '%s'" % (log.fmt_user(input), query))
|
||||||
result = new_gc(query)
|
result = new_gc(query)
|
||||||
for bw in search_badwords:
|
|
||||||
if bw in query:
|
|
||||||
print("[LOG]: %s queried Google Result Number for '%s' | DENIED: Badword" % (input.nick,query))
|
|
||||||
return phenny.reply("Gross!")
|
|
||||||
print("[LOG]: %s queried Google Result Number for '%s'" % (input.nick,query))
|
|
||||||
if result:
|
if result:
|
||||||
phenny.say(query + ": " + result)
|
phenny.say(query + ": " + result)
|
||||||
else: phenny.reply("Sorry, couldn't get a result.")
|
else: phenny.reply("Sorry, couldn't get a result.")
|
||||||
|
|
32
seen.py
32
seen.py
|
@ -52,6 +52,27 @@ def pushupdate(sender, nick):
|
||||||
updates.append((sender, ts, nick))
|
updates.append((sender, ts, nick))
|
||||||
update_l.release()
|
update_l.release()
|
||||||
|
|
||||||
|
def api_seen(nick):
|
||||||
|
dblock.acquire()
|
||||||
|
db = opendb()
|
||||||
|
c = db.cursor()
|
||||||
|
c.execute("SELECT channel, time FROM seen WHERE nick = ?", (nick,))
|
||||||
|
r = c.fetchone()
|
||||||
|
c.close()
|
||||||
|
db.close()
|
||||||
|
dblock.release()
|
||||||
|
return r
|
||||||
|
|
||||||
|
class SomeObject(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
seen_api = SomeObject()
|
||||||
|
seen_api.seen = api_seen
|
||||||
|
|
||||||
|
_export = {
|
||||||
|
'seen': seen_api,
|
||||||
|
}
|
||||||
|
|
||||||
def seen(phenny, input):
|
def seen(phenny, input):
|
||||||
"""seen <nick> - Reports when <nick> was last seen."""
|
"""seen <nick> - Reports when <nick> was last seen."""
|
||||||
nick = input.group(2)
|
nick = input.group(2)
|
||||||
|
@ -59,16 +80,9 @@ def seen(phenny, input):
|
||||||
return phenny.reply("Need a nickname to search for...")
|
return phenny.reply("Need a nickname to search for...")
|
||||||
nick = nick.lower()
|
nick = nick.lower()
|
||||||
|
|
||||||
print("[LOG]: %s queried Seen Result for %s" % (input.nick,nick))
|
log.log("event", "%s queried Seen database for '%s'" % (log.fmt_user(input), nick), phenny)
|
||||||
|
|
||||||
dblock.acquire()
|
r = api_seen(nick)
|
||||||
db = opendb()
|
|
||||||
c = db.cursor()
|
|
||||||
c.execute("SELECT channel, time FROM seen WHERE nick = ?", (nick,))
|
|
||||||
r = c.fetchone()
|
|
||||||
c.close()
|
|
||||||
db.close()
|
|
||||||
dblock.release()
|
|
||||||
|
|
||||||
if r:
|
if r:
|
||||||
channel, t = r[0], r[1]
|
channel, t = r[0], r[1]
|
||||||
|
|
21
tell.py
21
tell.py
|
@ -30,6 +30,22 @@ def tell_diskwr():
|
||||||
db.close()
|
db.close()
|
||||||
tell_pending = []
|
tell_pending = []
|
||||||
|
|
||||||
|
def api_tell(teller, tellee, text):
|
||||||
|
d = (teller, tellee, text, int(time.mktime(time.gmtime())))
|
||||||
|
tell_pending.append(("add", d))
|
||||||
|
# We do not insert the entry into tell_list yet because we don't know the id it will have
|
||||||
|
tell_diskwr() # Write the change to disk
|
||||||
|
|
||||||
|
class SomeObject(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
tell_api = SomeObject()
|
||||||
|
tell_api.tell = api_tell
|
||||||
|
|
||||||
|
_export = {
|
||||||
|
'tell': tell_api,
|
||||||
|
}
|
||||||
|
|
||||||
def tell(phenny, input):
|
def tell(phenny, input):
|
||||||
arg = input.group(2)
|
arg = input.group(2)
|
||||||
if not arg:
|
if not arg:
|
||||||
|
@ -46,10 +62,7 @@ def tell(phenny, input):
|
||||||
elif target[-1] == ":":
|
elif target[-1] == ":":
|
||||||
return phenny.reply("Do not put an : at the end of nickname")
|
return phenny.reply("Do not put an : at the end of nickname")
|
||||||
|
|
||||||
d = (teller, target, text, int(time.mktime(time.gmtime())))
|
api_tell(teller, target, text)
|
||||||
tell_pending.append(("add", d))
|
|
||||||
# We do not insert the entry into tell_list yet because we don't know the id it will have
|
|
||||||
tell_diskwr() # Write the change to disk
|
|
||||||
|
|
||||||
response = "I'll pass that on when %s is around" % target
|
response = "I'll pass that on when %s is around" % target
|
||||||
rand = random.random()
|
rand = random.random()
|
||||||
|
|
|
@ -76,7 +76,7 @@ def twitter(phenny, input):
|
||||||
arg = arg.strip()
|
arg = arg.strip()
|
||||||
if isinstance(arg, unicode):
|
if isinstance(arg, unicode):
|
||||||
arg = arg.encode('utf-8')
|
arg = arg.encode('utf-8')
|
||||||
print("[LOG]: %s queried Twitter for '%s'" % (input.nick,arg))
|
log.log("%s queried Twitter for '%s'" % (log.fmt_user(input), arg))
|
||||||
if arg.isdigit():
|
if arg.isdigit():
|
||||||
phenny.say(id_tweet(arg))
|
phenny.say(id_tweet(arg))
|
||||||
elif r_username.match(arg):
|
elif r_username.match(arg):
|
||||||
|
|
3
wiki.py
3
wiki.py
|
@ -136,7 +136,8 @@ def wik(phenny, input):
|
||||||
if not origterm:
|
if not origterm:
|
||||||
return phenny.say('Perhaps you meant "!wik Zen"?')
|
return phenny.say('Perhaps you meant "!wik Zen"?')
|
||||||
origterm = origterm.encode('utf-8')
|
origterm = origterm.encode('utf-8')
|
||||||
print("[LOG]: %s queried Minetest Wiki for '%s'" % (input.nick,origterm))
|
|
||||||
|
log.log("event", "%s queried Wiki for '%s'" % (log.fmt_user(input), origterm), phenny)
|
||||||
|
|
||||||
term = urllib.unquote(origterm)
|
term = urllib.unquote(origterm)
|
||||||
language = 'en'
|
language = 'en'
|
||||||
|
|
Loading…
Reference in New Issue