Fixed user name bug, made saving memories threading, added oofscoring, added logging

This commit is contained in:
aewens 2018-10-01 12:10:25 -04:00
parent 4e0978b534
commit b56de77a3f
7 changed files with 135 additions and 63 deletions

2
.gitignore vendored
View File

@ -2,7 +2,7 @@
settings.json settings.json
settings.demo.json settings.demo.json
data/*.json data/*.json
logs/*.log logs/*.log*
irc/ irc/
# ---> Python # ---> Python

View File

@ -1,8 +1,8 @@
from actions.botlist import botlist from actions.botlist import botlist
from actions.web import summon, whois
from actions.access import banish, pardon from actions.access import banish, pardon
from actions.control import puppet, inject, nomad from actions.control import puppet, inject, nomad
from actions.stupid import hmm, hmmscore, hmmscoreboard from actions.web import summon, whois, how_dare_you
from actions.stupid import score_word, wordscore, wordscoreboard
actions = [ actions = [
{ {
@ -20,6 +20,11 @@ actions = [
"pattern": "/!summon \S+ .+/", "pattern": "/!summon \S+ .+/",
"callback": summon "callback": summon
}, },
{
"type": "response",
"pattern": "/!summon \S+$/",
"callback": how_dare_you
},
{ {
"type": "response", "type": "response",
"pattern": "/!banish \S+ .+/", "pattern": "/!banish \S+ .+/",
@ -48,17 +53,32 @@ actions = [
{ {
"type": "response", "type": "response",
"pattern": "/hm+/", "pattern": "/hm+/",
"callback": hmm "callback": score_word("hmm", "hm+")
}, },
{ {
"type": "response", "type": "response",
"pattern": "/!hmmscore(\s|$)/", "pattern": "/!hmmscore(\s|$)/",
"callback": hmmscore "callback": wordscore("hmm")
}, },
{ {
"type": "response", "type": "response",
"pattern": "!hmmscoreboard", "pattern": "!hmmscoreboard",
"callback": hmmscoreboard "callback": wordscoreboard("hmm")
},
{
"type": "response",
"pattern": "/o+f/",
"callback": score_word("oof", "o+f")
},
{
"type": "response",
"pattern": "/!oofscore(\s|$)/",
"callback": wordscore("oof")
},
{
"type": "response",
"pattern": "!oofscoreboard",
"callback": wordscoreboard("oof")
}, },
{ {
"type": "response", "type": "response",

View File

@ -16,7 +16,7 @@ def banish(self, name, source, response):
"when": datetime.now().timestamp() "when": datetime.now().timestamp()
} }
self.bot.save_memories() self.bot.thread(self.bot.save_memories)
confirmation = "{} has been banished for reason: {}".format(user, reason) confirmation = "{} has been banished for reason: {}".format(user, reason)
self.bot.send_message(source, confirmation) self.bot.send_message(source, confirmation)
@ -31,7 +31,7 @@ def pardon(self, name, source, response):
del self.bot.memories["users"][user]["blacklist"] del self.bot.memories["users"][user]["blacklist"]
self.bot.save_memories() self.bot.thread(self.bot.save_memories)
confirmation = "{} has been pardoned".format(user) confirmation = "{} has been pardoned".format(user)
self.bot.send_message(source, confirmation) self.bot.send_message(source, confirmation)

View File

@ -1,11 +1,15 @@
import re import re
import operator import operator
def hmm(self, name, source, response): def capitalize(word):
return word[0].upper() + word[1:]
def score_word(word, regex):
def wording(self, name, source, response):
check = response.lower().strip() check = response.lower().strip()
botnick = self.bot.botnick botnick = self.bot.botnick
pattern = re.compile("hm+") pattern = re.compile(regex)#"hm+")
matches = re.findall(pattern, check) matches = re.findall(pattern, check)
maximum = 10 maximum = 10
score = len(matches) if len(matches) <= maximum else maximum score = len(matches) if len(matches) <= maximum else maximum
@ -16,18 +20,22 @@ def hmm(self, name, source, response):
if name not in self.bot.memories["users"]: if name not in self.bot.memories["users"]:
self.bot.memories["users"][name] = dict() self.bot.memories["users"][name] = dict()
if "hmmscore" not in self.bot.memories["users"][name]: keyword = "{}score".format(word)
self.bot.memories["users"][name]["hmmscore"] = 0
current_score = self.bot.memories["users"][name]["hmmscore"] if keyword not in self.bot.memories["users"][name]:
self.bot.memories["users"][name]["hmmscore"] = current_score + score self.bot.memories["users"][name][keyword] = 0
self.bot.save_memories() current_score = self.bot.memories["users"][name][keyword]
self.bot.memories["users"][name][keyword] = current_score + score
def hmmscore(self, name, source, response): self.bot.thread(self.bot.save_memories)
return wording
def wordscore(word):
def scoring(self, name, source, response):
botnick = self.bot.botnick botnick = self.bot.botnick
score = 0 score = 0
score_format = "Hmm score for '{}': {}" score_format = "%s score for '{}': {}" % (capitalize(word))
if " " in response: if " " in response:
name = response.split(" ", 1)[1].strip() name = response.split(" ", 1)[1].strip()
@ -36,29 +44,38 @@ def hmmscore(self, name, source, response):
self.bot.send_message(source, score_format.format(name, score)) self.bot.send_message(source, score_format.format(name, score))
return return
if "hmmscore" in self.bot.memories["users"][name]: keyword = "{}score".format(word)
score = self.bot.memories["users"][name]["hmmscore"]
if keyword not in self.bot.memories["users"][name]:
self.bot.send_message(source, score_format.format(name, score)) self.bot.send_message(source, score_format.format(name, score))
return return
def hmmscoreboard(self, name, source, response): score = self.bot.memories["users"][name][keyword]
self.bot.send_message(source, score_format.format(name, score))
return scoring
def wordscoreboard(word):
def scoreboard(self, name, source, response):
botnick = self.bot.botnick botnick = self.bot.botnick
hmmscores = list() scores = list()
for user, values in self.bot.memories["users"].items(): for user, values in self.bot.memories["users"].items():
hmmscores.append({ scores.append({
"name": user, "name": user,
"score": values.get("hmmscore", 0) "score": values.get("{}score".format(word), 0)
}) })
size = 3 size = 3
start = -size start = -size
sort_scores = sorted(hmmscores, key=lambda k: k["score"]) sort_scores = sorted(scores, key=lambda k: k["score"])
top_scores = sort_scores[start:][::-1] top_scores = sort_scores[start:][::-1]
leaders = " | ".join([ leaders = " | ".join([
"{} {}".format(ts["name"], ts["score"]) for ts in top_scores "{} {}".format(ts["name"], ts["score"]) for ts in top_scores
]) ])
self.bot.send_message(source, "Hmm Score Leaderboard: {}".format(leaders)) response = "{} Score Leaderboard: {}".format(capitalize(word), leaders)
self.bot.send_message(source, response)
return scoreboard

View File

@ -74,6 +74,11 @@ def summon(self, name, source, response):
confirmation = "{}: You have summoned {}".format(name, user) confirmation = "{}: You have summoned {}".format(name, user)
self.bot.send_message(source, confirmation) self.bot.send_message(source, confirmation)
def how_dare_you(self, name, source, response):
user = response.split("!summon ")[1]
rude = "{}: You think you can just summon someone without a reason? Rude."
self.bot.send_message(source, rude.format(user))
def whois(self, name, source, response): def whois(self, name, source, response):
botnick = self.bot.botnick botnick = self.bot.botnick
domain = response.split("!whois ")[1] domain = response.split("!whois ")[1]

10
app.py
View File

@ -68,17 +68,26 @@ def handle_mode(channel, mode):
try_to_king_me(channel) try_to_king_me(channel)
def handle_invite(channel, name): def handle_invite(channel, name):
changed = False
if channel in kingme: if channel in kingme:
try_to_king_me(channel) try_to_king_me(channel)
users = bot.memories["users"] users = bot.memories["users"]
if name not in users: if name not in users:
bot.memories["users"][name] = dict() bot.memories["users"][name] = dict()
changed = True
if "invites" not in users[name]: if "invites" not in users[name]:
bot.memories["users"][name]["invites"] = list() bot.memories["users"][name]["invites"] = list()
changed = True
if channel not in bot.memories["users"][name]["invites"]:
bot.memories["users"][name]["invites"].append(channel) bot.memories["users"][name]["invites"].append(channel)
changed = True
if changed:
bot.thread(bot.save_memories)
def handle_kick(name): def handle_kick(name):
users = bot.memories["users"] users = bot.memories["users"]
@ -86,6 +95,7 @@ def handle_kick(name):
bot.memories["users"][name] = dict() bot.memories["users"][name] = dict()
bot.memories["users"][name]["kicker"] = True bot.memories["users"][name]["kicker"] = True
bot.thread(bot.save_memories)
def handle_message(name, source, response): def handle_message(name, source, response):
responses.parse(name, source, response) responses.parse(name, source, response)

View File

@ -3,6 +3,7 @@ import json
import socket import socket
import os.path import os.path
import logging import logging
from threading import Thread
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
logging.basicConfig( logging.basicConfig(
@ -76,12 +77,11 @@ class Bot:
return return
raw_users = user_listing[1].split(" \r\n")[0].split(" ") raw_users = user_listing[1].split(" \r\n")[0].split(" ")
prefix_filter = lambda u: u[1:] if "~" in u or "@" in u else u # prefix_filter = lambda u: u[1:] if "~" in u or "@" in u or "+" in u else u
users = list(filter(prefix_filter, raw_users)) users = list(filter(self.parse_name, raw_users))
remember = self.memories["users"] remember = self.memories["users"]
for user in users: for user in users:
if user[0] == "~" or user[0] == "@": user = self.parse_name(user)
user = user[1:]
if user not in remember: if user not in remember:
self.memories["users"][user] = dict() self.memories["users"][user] = dict()
@ -98,21 +98,31 @@ class Bot:
def get_name(self, text): def get_name(self, text):
return text.split("!", 1)[0][1:] return text.split("!", 1)[0][1:]
def parse_name(self, name):
if name[0] == "~" or name[0] == "@" or name[0] == "+":
return name[1:]
else:
return name
def parse(self, message): def parse(self, message):
before, after = message.split("PRIVMSG ", 1) before, after = message.split("PRIVMSG ", 1)
name = self.get_name(before) name = self.parse_name(self.get_name(before))
source, response = after.split(" :", 1) source, response = after.split(" :", 1)
return name, source, response return name, source, response
def handle_mode(self, message): def handle_mode(self, message):
before, after = message.split("MODE ", 1) before, after = message.split("MODE ", 1)
name = self.get_name(before) name = self.parse_name(self.get_name(before))
channel, mode = after.split(" ")[:2] channel, mode = after.split(" ")[:2]
return channel, mode return channel, mode
def handle_rename(self, message): def handle_rename(self, message):
before, new_name = message.split("NICK ", 1) before, new_name = message.split("NICK ", 1)
name = self.get_name(before) name = self.get_name(before)
new_name = self.parse_name(new_name)
name = self.parse_name(name)
user = self.memories["users"][name] user = self.memories["users"][name]
del self.memories["users"][name] del self.memories["users"][name]
self.memories["users"][new_name] = user self.memories["users"][new_name] = user
@ -120,19 +130,19 @@ class Bot:
def handle_invite(self, message): def handle_invite(self, message):
before, after = message.split("INVITE ", 1) before, after = message.split("INVITE ", 1)
name = self.get_name(before) name = self.parse_name(self.get_name(before))
channel = after.split(":", 1)[1] channel = after.split(":", 1)[1]
self.join(channel) self.join(channel)
return channel, name return channel, name
def handle_kick(self, message): def handle_kick(self, message):
before, after = message.split("KICK ", 1) before, after = message.split("KICK ", 1)
name = self.get_name(before) name = self.parse_name(self.get_name(before))
return name return name
def handle_join(self, message): def handle_join(self, message):
before, after = message.split("JOIN ", 1) before, after = message.split("JOIN ", 1)
user = self.get_name(before) user = self.parse_name(self.get_name(before))
if user not in self.memories["users"]: if user not in self.memories["users"]:
self.memories["users"][user] = dict() self.memories["users"][user] = dict()
@ -141,7 +151,7 @@ class Bot:
def handle_part(self, message): def handle_part(self, message):
before, after = message.split("PART ", 1) before, after = message.split("PART ", 1)
user = self.get_name(before) user = self.parse_name(self.get_name(before))
return user return user
def load_memories(self, location): def load_memories(self, location):
@ -156,6 +166,11 @@ class Bot:
with open(path, "r") as f: with open(path, "r") as f:
self.memories = json.loads(f.read()) self.memories = json.loads(f.read())
def thread(self, fn, *args):
print((self, *args))
t = Thread(target=fn, args=args)
t.start()
def save_memories(self): def save_memories(self):
with open(self.memories_path, "w") as f: with open(self.memories_path, "w") as f:
try: try:
@ -243,6 +258,11 @@ class Bot:
message = self.ircsock.recv(self.recv_size).decode() message = self.ircsock.recv(self.recv_size).decode()
message = message.strip(self.splitter) message = message.strip(self.splitter)
print(message) print(message)
if "new_nick' commands." in message:
self.logger.warning(message)
self.send_message(self.author, "ERROR: {}".format(message))
self.logger.debug(message) self.logger.debug(message)
if "raw" in callback: if "raw" in callback: