From e8fcd048fe805a9caec4eacefd8631dcad9e6638 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 10 Feb 2012 15:02:19 +0100 Subject: [PATCH 1/5] Feature log on/off --- settings-sample.py | 4 +++- snurr.py | 21 +++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/settings-sample.py b/settings-sample.py index 99ede79..863c91c 100644 --- a/settings-sample.py +++ b/settings-sample.py @@ -1,4 +1,6 @@ -# snurrbot database configuration +# snurrbot configuration +DISABLE_LOG = False +# DATABASE DB_API_ADAPTER = "MySQLdb" # DB-API 2.0 adapter DB_HOST = "localhost" # hostname DB_USER = "snurr" # username diff --git a/snurr.py b/snurr.py index f342ec7..a06084c 100755 --- a/snurr.py +++ b/snurr.py @@ -3,9 +3,9 @@ import optparse import subprocess import time -import MySQLdb from datetime import datetime + from twisted.words.protocols import irc from twisted.internet import protocol, reactor, ssl from twisted.enterprise import adbapi @@ -13,6 +13,9 @@ from twisted.python import log import settings +if not settings.DISABLE_LOG: + import MySQLdb + class SnurrBot(irc.IRCClient): def __init__(self): self.actions = IRCActions(self) @@ -95,7 +98,8 @@ class UDPListener(protocol.DatagramProtocol): class IRCActions(): def __init__(self, bot): self.bot = bot - self.dbpool = self._get_dbpool() + if not settings.DISABLE_LOG: + self.dbpool = self._get_dbpool() def _get_dbpool(self): # Setup an async db connection @@ -124,10 +128,11 @@ class IRCActions(): text = "" text += "Command: !help\n" text += " This help message\n" - text += "Command: !log DESCRIPTION\n" - text += " Add new entry in log\n" - text += "Command: !lastlog\n" - text += " Last 3 log entries\n" + if not settings.DISABLE_LOG: + text += "Command: !log DESCRIPTION\n" + text += " Add new entry in log\n" + text += "Command: !lastlog\n" + text += " Last 3 log entries\n" text += "Command: !ping HOST\n" text += " Ping target host" return text @@ -145,11 +150,11 @@ class IRCActions(): self.bot.msgReply(nick, channel, self.ping(parts[1])) elif parts[0] == "help" and len(parts) == 1: self.bot.msgReply(nick, channel, self.help()) - elif parts[0] == "log" and len(parts) >= 2: + elif parts[0] == "log" and len(parts) >= 2 and not settings.DISABLE_LOG: # set_log_entry should create a deferred and # the callback should fire when the db returns. self.set_log_entry(nick, parts[1:]).addCallback(self.msg_log_entry, channel, nick) - elif parts[0] == "lastlog" and len(parts) == 1: + elif parts[0] == "lastlog" and len(parts) == 1 and not settings.DISABLE_LOG: # ...same as above self.get_lastlog().addCallback(self.msg_lastlog, channel, nick) else: From c3d415c92f87f5e17f134eb2d1d9d339690e5215 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Thu, 15 Nov 2012 17:37:32 +0100 Subject: [PATCH 2/5] Adds tetris highscore --- snurr.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/snurr.py b/snurr.py index a06084c..1d5ce44 100755 --- a/snurr.py +++ b/snurr.py @@ -100,6 +100,7 @@ class IRCActions(): self.bot = bot if not settings.DISABLE_LOG: self.dbpool = self._get_dbpool() + self.tetris_dbpool = self._get_tetris_dbpool() def _get_dbpool(self): # Setup an async db connection @@ -109,6 +110,14 @@ class IRCActions(): charset="utf8", use_unicode=True, cp_reconnect=True) + def _get_tetris_dbpool(self): + # Setup an async db connection + return ReconnectingConnectionPool(settings.DB_API_ADAPTER, + host=settings.TETRIS_DB_HOST, user=settings.TETRIS_DB_USER, + passwd=settings.TETRIS_DB_PASSWORD, db=settings.TETRIS_DB_NAME, + charset="utf8", use_unicode=True, + cp_reconnect=True) + def ping(self, host): # TODO rewrite async try: @@ -157,6 +166,9 @@ class IRCActions(): elif parts[0] == "lastlog" and len(parts) == 1 and not settings.DISABLE_LOG: # ...same as above self.get_lastlog().addCallback(self.msg_lastlog, channel, nick) + elif parts[0] == "tetrishigh" and len(parts) == 1 and not settings.DISABLE_TETRIS: + self.get_tetris_highscore().addCallback(self.msg_tetris_highscore, channel, nick) + else: self.bot.msgReply(nick, channel, "Need !help " + nick + "?") @@ -178,6 +190,15 @@ class IRCActions(): string_entry = str(i) + ": " + entry[2] + " (" + entry[1] + ", " + str(entry[3]) + ")" self.bot.msgReply(nick, channel, string_entry.encode("utf-8")) + def get_tetris_highscore(self): + sql = "SELECT * FROM highscore ORDER BY score DESC LIMIT 1" + return self.tetris_dbpool.runQuery(sql) + + def msg_tetris_highscore(self, highscore, channel, nick): + h_id,score,name,time,ip,country = highscore[0] + string_highscore = "Tetris AI highscore: " + str(score) + " by " + name + "." + self.bot.msgReply(nick, channel, string_highscore.encode("utf-8")) + class ReconnectingConnectionPool(adbapi.ConnectionPool): """Reconnecting adbapi connection pool for MySQL. From b33346bd1cf4bb1e59e93cb3aa202d8c20b18d7d Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Thu, 15 Nov 2012 17:38:15 +0100 Subject: [PATCH 3/5] With sample config --- settings-sample.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/settings-sample.py b/settings-sample.py index 863c91c..392d2d1 100644 --- a/settings-sample.py +++ b/settings-sample.py @@ -6,3 +6,10 @@ DB_HOST = "localhost" # hostname DB_USER = "snurr" # username DB_PASSWORD = "" DB_NAME = "snurr" + +DISABLE_TETRIS = False +TETRIS_DB_HOST = "localhost" # hostname +TETRIS_DB_USER = "snurr_tetris" # username +TETRIS_DB_PASSWORD = "" +TETRIS_DB_NAME = "paalbra_tetris" + From 51bdd74a2f0c65a5c6e3079223f2b6d15c70c09a Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 16 Nov 2012 16:03:48 +0100 Subject: [PATCH 4/5] !tetrishigh: prints top 3 highscores grouped by name --- snurr.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/snurr.py b/snurr.py index 1d5ce44..64704b6 100755 --- a/snurr.py +++ b/snurr.py @@ -191,13 +191,14 @@ class IRCActions(): self.bot.msgReply(nick, channel, string_entry.encode("utf-8")) def get_tetris_highscore(self): - sql = "SELECT * FROM highscore ORDER BY score DESC LIMIT 1" + sql = "SELECT MAX(score) AS highscore, name FROM highscore GROUP BY name ORDER BY highscore DESC LIMIT 3" return self.tetris_dbpool.runQuery(sql) - def msg_tetris_highscore(self, highscore, channel, nick): - h_id,score,name,time,ip,country = highscore[0] - string_highscore = "Tetris AI highscore: " + str(score) + " by " + name + "." - self.bot.msgReply(nick, channel, string_highscore.encode("utf-8")) + def msg_tetris_highscore(self, highscores, channel, nick): + for highscore in highscores: + high,name = highscore + string_highscore = "Highscore: " + str(score) + " by " + name + "." + self.bot.msgReply(nick, channel, string_highscore.encode("utf-8")) class ReconnectingConnectionPool(adbapi.ConnectionPool): """Reconnecting adbapi connection pool for MySQL. From 55b8b7708be4d6a16a1c930e82eb037d55381002 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 16 Nov 2012 16:05:40 +0100 Subject: [PATCH 5/5] Oops --- snurr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snurr.py b/snurr.py index 64704b6..9af8ffd 100755 --- a/snurr.py +++ b/snurr.py @@ -197,7 +197,7 @@ class IRCActions(): def msg_tetris_highscore(self, highscores, channel, nick): for highscore in highscores: high,name = highscore - string_highscore = "Highscore: " + str(score) + " by " + name + "." + string_highscore = "Highscore: " + str(high) + " by " + name + "." self.bot.msgReply(nick, channel, string_highscore.encode("utf-8")) class ReconnectingConnectionPool(adbapi.ConnectionPool):