aboutsummaryrefslogtreecommitdiffstats
path: root/titlebot
diff options
context:
space:
mode:
Diffstat (limited to 'titlebot')
-rwxr-xr-xtitlebot/commands/highest30
-rwxr-xr-xtitlebot/commands/list4
-rwxr-xr-xtitlebot/commands/undo10
-rwxr-xr-xtitlebot/commands/up18
-rw-r--r--titlebot/titlebot.py31
5 files changed, 73 insertions, 20 deletions
diff --git a/titlebot/commands/highest b/titlebot/commands/highest
new file mode 100755
index 0000000..d0408ac
--- /dev/null
+++ b/titlebot/commands/highest
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+import json
+from os import environ
+import sys
+import os
+import poll
+
+f = 'suggestions.json'
+title=" ".join(sys.argv[1:])
+db = poll.load_db(f)
+# only print the last N values (default 1)
+limit = int(sys.argv[1]) if len(sys.argv) > 1 else 1
+num = 0
+last_vote = 9001
+# stolen from http://stackoverflow.com/questions/9647202/ordinal-numbers-replacement
+suffixes = ["th", "st", "nd", "rd", ] + ["th"] * 16
+
+for entry in poll.sort_by_votes(db):
+ # if two entries have the same number of upvotes, do not increment the rank
+ current_vote = sum(entry['votes'].values())
+ if current_vote < last_vote:
+ num = num + 1
+ last_vote = current_vote
+ # exit if we are above the limit
+ if num > limit:
+ sys.exit(0)
+
+ suffixed_num = str(num) + suffixes[num % 100]
+ print("%s: '%s' (%d votes)" %
+ (suffixed_num,entry['title'],sum(entry['votes'].values())))
diff --git a/titlebot/commands/list b/titlebot/commands/list
index 3a29919..cee4b8a 100755
--- a/titlebot/commands/list
+++ b/titlebot/commands/list
@@ -17,11 +17,11 @@ if len(sys.argv) > 1 and ("-h" in sys.argv[1] or "usage" == sys.argv[1]):
if len(sys.argv) > 1 and ("votes" in sys.argv[1]):
use = poll.sort_by_votes(db)
elif len(sys.argv) > 1 and ("age" in sys.argv[1]) or len(sys.argv) == 1:
- pass
+ use = db
else:
print("unknown sorting method")
sys.exit(1)
-for entry in poll.sort_by_votes(db):
+for entry in use:
print("#%d %s (votes: %d)" %
(db.index(entry),entry['title'],sum(entry['votes'].values())))
diff --git a/titlebot/commands/undo b/titlebot/commands/undo
index bebd57a..a66de67 100755
--- a/titlebot/commands/undo
+++ b/titlebot/commands/undo
@@ -16,12 +16,16 @@ except:
undos vote of one or more entries based on .list""")
sys.exit(1)
voter = environ['_prefix']
+voter_name = environ['_from']
for vote in votes:
try:
vote = int(vote)
- del(db[vote]['votes'][voter] )
- print("undid vote by %s for #%d" %(environ['_from'],vote))
+ if not voter in db[vote]['votes']:
+ print("%s, you never voted for '%s'!"%(voter_name,db[vote]['title']))
+ else:
+ del(db[vote]['votes'][voter] )
+ print("%s undid vote for '%s'" %(voter_name,db[vote]['title'] ))
except:
- print("undo voting for #%s failed" %vote)
+ print("%s undo voting for #%d failed" %(voter_name,vote))
poll.save_db(f,db)
diff --git a/titlebot/commands/up b/titlebot/commands/up
index c9de122..0a48bdb 100755
--- a/titlebot/commands/up
+++ b/titlebot/commands/up
@@ -9,19 +9,25 @@ import poll
f = 'suggestions.json'
db = poll.load_db(f)
votes = []
-try:
- votes = sys.argv[1:]
-except:
+votes = sys.argv[1:]
+if not votes:
print("""usage: up number (...)
upvotes one or more entries based on .list""")
sys.exit(1)
voter = environ['_prefix']
+voter_name =environ['_from']
for vote in votes:
try:
vote = int(vote)
- db[vote]['votes'][voter] = 1
+ if vote < 0:
+ raise Exception()
+ if voter in db[vote]['votes']:
+ print("%s, you already have voted for '%s'"%(voter_name,db[vote]['title']) )
+ else:
+ db[vote]['votes'][voter] = 1
+ print("%s voted for '%s'"%(voter_name,db[vote]['title']))
except:
- print("voting for #%s failed" %vote)
-print("Thanks for your votes %s"%environ['_from'])
+ print("%s, voting for #%s failed" %(voter_name,vote))
+
poll.save_db(f,db)
diff --git a/titlebot/titlebot.py b/titlebot/titlebot.py
index dc4e28a..c1eac3b 100644
--- a/titlebot/titlebot.py
+++ b/titlebot/titlebot.py
@@ -1,5 +1,6 @@
from os import environ,mkdir
-
+from os.path import abspath, expanduser
+import re
debug = False
# CAVEAT name should not contains regex magic
@@ -21,26 +22,37 @@ irc_restart_timeout = 5
irc_channels = [
'#binaergewitter'
]
+admin_file=workdir+'/admin.lst'
+auth_file=workdir+'/auth.lst'
+
+config_filename = abspath(__file__)
-admin_file=workdir+'/'+'admin.lst'
try:
with open(admin_file,"x"): pass
except: pass
-auth_file=workdir+'/'+'auth.lst'
-def default_command(cmd):
+# me is used, so name cannot kill our patterns below
+me = '\\b' + re.escape(name) + '\\b'
+me_or_us = '(?:' + me + '|\\*)'
+
+def default_command(cmd, env=None):
+ if not env: env = {}
return {
'capname': cmd,
- 'pattern': '^(?:' + name + '|\\*):\\s*' + cmd + '\\s*(?:\\s+(?P<args>.*))?$',
- 'argv': [ 'commands/' + cmd ] }
+ 'pattern': '^' + me_or_us + ':\\s*' + cmd + '\\s*(?:\\s+(?P<args>.*))?$',
+ 'argv': [ 'commands/' + cmd ],
+ 'env': env
+ }
def titlebot_cmd(cmd):
return {
'capname': cmd,
- 'pattern': '\\.' + cmd + '\\s*(?:\\s+(?P<args>.*))?$',
+ 'pattern': '^\\.' + cmd + '\\s*(?:\\s+(?P<args>.*))?$',
'argv': [ 'titlebot/commands/' + cmd ] }
public_commands = [
- default_command('caps'),
+ default_command('caps', env={
+ 'config_filename': config_filename
+ }),
default_command('hello'),
default_command('badcommand'),
default_command('rev'),
@@ -48,13 +60,14 @@ public_commands = [
default_command('nocommand'),
titlebot_cmd('list'),
titlebot_cmd('help'),
+ titlebot_cmd('highest'),
titlebot_cmd('up'),
titlebot_cmd('new'),
titlebot_cmd('undo'),
titlebot_cmd('down'),
# identify via direct connect
{ 'capname': 'identify',
- 'pattern': '^identify' + '\\s*(?:\\s+(?P<args>.*))?$',
+ 'pattern': '^identify' + '\\s*(?:\\s+(?P<args>.*))?$',
'argv' : [ 'commands/identify' ]}
]
commands = [