another big diff. tested some things

This commit is contained in:
Ben Harris 2018-10-09 02:43:19 -04:00
parent 99cf1c5822
commit 649a56f6c2
Signed by untrusted user: ben
GPG Key ID: 4E0AF802FFF7960C
17 changed files with 180 additions and 553 deletions

2
Code/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.pyc
__pycache__/

View File

@ -10,6 +10,7 @@ import fileinput
import random import random
import re import re
import subprocess import subprocess
import textwrap
import time import time
import datetime import datetime
@ -17,7 +18,6 @@ import inflect
from rhymesWith import getRhymes from rhymesWith import getRhymes
from rhymesWith import rhymeZone from rhymesWith import rhymeZone
from defineWord import defWord from defineWord import defWord
from rainbow import makeRainbow
import welch import welch
import evil import evil
import tumblr import tumblr
@ -49,7 +49,7 @@ parser.add_option(
"-n", "-n",
"--nick", "--nick",
dest="nick", dest="nick",
default="tildebot", default="banterbot",
help="the nick to use", help="the nick to use",
metavar="NICK", metavar="NICK",
) )
@ -200,7 +200,7 @@ def define_word(channel, user, text):
def make_rainbow(channel, user, text): def make_rainbow(channel, user, text):
rbword = makeRainbow(text[9:]) rbword = util.makeRainbow(text[9:])
util.sendmsg(ircsock, channel, rbword) util.sendmsg(ircsock, channel, rbword)
@ -320,37 +320,28 @@ def mug_off(channel):
def rollcall(channel): def rollcall(channel):
util.sendmsg( text = """
ircsock,
channel,
"""
U wot m8? I score all the top drawer #banter and #bantz on this channel! U wot m8? I score all the top drawer #banter and #bantz on this channel!
Find new top-shelf banter with !newbanter, !rhymes, and !define. Find new top-shelf banter with !newbanter, !rhymes, and !define.
Look up things with !acronym and !whosaid. Look up things with !acronym and !whosaid.
Make your chatter #legend with !rainbow, !toilet, and !figlet. Make your chatter #legend with !rainbow, !toilet, and !figlet.
Find interesting things with !xkcd and !wiki-philosophy. Find interesting things with !xkcd and !wiki-philosophy.
Get jokes with !welch and !evil Get jokes with !welch and !evil
""", """
) for line in textwrap.dedent(text).split("\n"):
if line == "":
continue
def get_user_from_message(msg): util.sendmsg(ircsock, channel, line)
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def listen(botnick): def listen(botnick):
while 1: while 1:
ircmsg = ircsock.recv(2048) ircmsg = ircsock.recv(2048).decode()
ircmsg = ircmsg.strip("\n\r") ircmsg = ircmsg.strip("\n\r")
if ircmsg[:4] == "PING": if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1]) util.ping(ircsock, ircmsg)
formatted = util.format_message(ircmsg) formatted = util.format_message(ircmsg)
@ -359,7 +350,7 @@ def listen(botnick):
# print formatted # print formatted
time, user, command, channel, messageText = formatted.split("\t") _time, user, _command, channel, messageText = formatted.split("\t")
if ircmsg.find("#banter") != -1 or ircmsg.find("#bantz") != -1: if ircmsg.find("#banter") != -1 or ircmsg.find("#bantz") != -1:
score_banter(channel, user, messageText) score_banter(channel, user, messageText)
@ -418,7 +409,7 @@ def listen(botnick):
mug_off(channel) mug_off(channel)
if ircmsg[:4] == "PING": if ircmsg[:4] == "PING":
util.ping(ircsock, msg) util.ping(ircsock, ircmsg)
sys.stdout.flush() sys.stdout.flush()
time.sleep(1) time.sleep(1)

View File

@ -5,7 +5,7 @@ import random
def define(word): def define(word):
defs = [] defs = []
url = "http://www.merriam-webster.com/dictionary/%s" % word url = "http://www.merriam-webster.com/dictionary/{}".format(word)
soup = BeautifulSoup(urllib.urlopen(url).read(), "html.parser") soup = BeautifulSoup(urllib.urlopen(url).read(), "html.parser")
head = soup.find("div", id="headword") head = soup.find("div", id="headword")
if head: if head:
@ -19,9 +19,8 @@ key = open("/home/krowbar/.secret/key").readline().rstrip()
def defWord(word, short=True): def defWord(word, short=True):
defs = [] defs = []
url = "http://www.dictionaryapi.com/api/v1/references/collegiate/xml/%s?key=%s" % ( url = "http://www.dictionaryapi.com/api/v1/references/collegiate/xml/{}?key={}".format(
word, word, key
key,
) )
soup = BeautifulSoup(urllib.urlopen(url).read(), "html5lib") soup = BeautifulSoup(urllib.urlopen(url).read(), "html5lib")
entry = soup.find("entry") entry = soup.find("entry")

View File

@ -7,8 +7,9 @@ dictionary = "/usr/share/dict/american-english-small"
BAD_WORDS_FILE = "badwords.txt" BAD_WORDS_FILE = "badwords.txt"
def get_wordlist(): def gen_wordlist():
# I feel weird calling this "get_wordlist" when it's a generator without calling out that I do in fact realise it's weird - ~deltawitch # I feel weird calling this "get_wordlist" when it's a generator without calling out that I do in fact realise it's weird - ~deltawitch
# how about gen_wordlist
with open(BAD_WORDS_FILE, "r") as fp: with open(BAD_WORDS_FILE, "r") as fp:
bad_words = set(fp) bad_words = set(fp)
@ -18,14 +19,11 @@ def get_wordlist():
def get_puzzle(): def get_puzzle():
dict_words = list(get_wordlist()) dict_words = list(gen_wordlist())
words = random.sample(dict_words, 3) words = random.sample(dict_words, 3)
key = random.randrange(0, 3) # get values 1-3 key = random.randrange(0, 3) # get values 1-3
puzzle = ( puzzle = "When alphebetized, what is the {} in {}?".format(
"When alphebetized, what is the " p.ordinal(p.number_to_words(key + 1)), ", ".join(words)
+ p.ordinal(p.number_to_words(key + 1))
+ " in "
+ ", ".join(words)
) )
words.sort() words.sort()
answer = words[key] answer = words[key]
@ -34,14 +32,12 @@ def get_puzzle():
def get_anagram(maxlen=6): def get_anagram(maxlen=6):
dict_words = [ dict_words = [
word for word in get_wordlist() if len(word) > 2 and len(word) <= maxlen + 1 word for word in gen_wordlist() if len(word) > 2 and len(word) < maxlen + 1
] ]
word = random.choice(dict_words) word = random.choice(dict_words)
while True: anagram = list(word)
anagram = "".join(random.sample(word, len(word))) random.shuffle(anagram)
if anagram != word: anagram = "".join(anagram)
break
puzzle = "Unscramble the following word: '" + anagram + "'"
# Anagrams can have multiple answers, so we provide a check function that accepts all possibilities # Anagrams can have multiple answers, so we provide a check function that accepts all possibilities
def answer_checker(guess): def answer_checker(guess):
@ -52,6 +48,7 @@ def get_anagram(maxlen=6):
if sorted(guess) != sorted(word): if sorted(guess) != sorted(word):
return False return False
# Ok, gotta actually check if it's a word now # Ok, gotta actually check if it's a word now
return any(guess == item for item in get_wordlist()) return any(guess == item for item in gen_wordlist())
return [answer_checker, puzzle] challenge_text = "Unscramble the following word: '{}'".format(anagram)
return [answer_checker, challenge_text]

View File

@ -1,5 +1,5 @@
import requests
import urllib import urllib
import urllib2
import json as j import json as j
import sys import sys
@ -50,12 +50,9 @@ def query(
encparams = urllib.urlencode(params) encparams = urllib.urlencode(params)
url = "http://api.duckduckgo.com/?" + encparams url = "http://api.duckduckgo.com/?" + encparams
request = urllib2.Request(url, headers={"User-Agent": useragent}) request = requests.get(url, headers={"User-Agent": useragent})
response = urllib2.urlopen(request)
json = j.loads(response.read())
response.close()
return Results(json) return Results(request.json())
class Results(object): class Results(object):

View File

@ -1,115 +0,0 @@
# integer number to english word conversion
# can be used for numbers as large as 999 vigintillion
# (vigintillion --> 10 to the power 60)
# tested with Python24 vegaseat 07dec2006
def int2word(n):
"""
convert an integer number n into a string of english words
"""
# break the number into groups of 3 digits using slicing
# each group representing hundred, thousand, million, billion, ...
n3 = []
r1 = ""
# create numeric string
ns = str(n)
for k in range(3, 33, 3):
r = ns[-k:]
q = len(ns) - k
# break if end of ns has been reached
if q < -2:
break
else:
if q >= 0:
n3.append(int(r[:3]))
elif q >= -1:
n3.append(int(r[:2]))
elif q >= -2:
n3.append(int(r[:1]))
r1 = r
# print n3 # test
# break each group of 3 digits into
# ones, tens/twenties, hundreds
# and form a string
nw = ""
for i, x in enumerate(n3):
b1 = x % 10
b2 = (x % 100) // 10
b3 = (x % 1000) // 100
# print b1, b2, b3 # test
if x == 0:
continue # skip
else:
t = thousands[i]
if b2 == 0:
nw = ones[b1] + t + nw
elif b2 == 1:
nw = tens[b1] + t + nw
elif b2 > 1:
nw = twenties[b2] + ones[b1] + t + nw
if b3 > 0:
nw = ones[b3] + "hundred " + nw
return nw
############# globals ################
ones = [
"",
"one ",
"two ",
"three ",
"four ",
"five ",
"six ",
"seven ",
"eight ",
"nine ",
]
tens = [
"ten ",
"eleven ",
"twelve ",
"thirteen ",
"fourteen ",
"fifteen ",
"sixteen ",
"seventeen ",
"eighteen ",
"nineteen ",
]
twenties = [
"",
"",
"twenty ",
"thirty ",
"forty ",
"fifty ",
"sixty ",
"seventy ",
"eighty ",
"ninety ",
]
thousands = [
"",
"thousand ",
"million ",
"billion ",
"trillion ",
"quadrillion ",
"quintillion ",
"sextillion ",
"septillion ",
"octillion ",
"nonillion ",
"decillion ",
"undecillion ",
"duodecillion ",
"tredecillion ",
"quattuordecillion ",
"sexdecillion ",
"septendecillion ",
"octodecillion ",
"novemdecillion ",
"vigintillion ",
]

Binary file not shown.

View File

@ -43,54 +43,46 @@ def make_puzzle(obfuscate=True):
if roll == 0: if roll == 0:
answer = var1 + var2 answer = var1 + var2
puzzle += ( puzzle += "{} {} {}".format(
p.number_to_words(var1) p.number_to_words(var1),
+ " " random.choice(["and", "plus", "sum", "add"]),
+ random.choice(["and", "plus", "sum", "add"]) p.number_to_words(var2),
+ " "
+ p.number_to_words(var2)
) )
elif roll == 1: elif roll == 1:
answer = var1 * var2 answer = var1 * var2
puzzle += ( puzzle += "{} {} {}".format(
p.number_to_words(var1) p.number_to_words(var1),
+ " " random.choice(["times", "multiply", "multiplied by", "product"]),
+ random.choice(["times", "multiply", "multiplied by", "product"]) p.number_to_words(var2),
+ " "
+ p.number_to_words(var2)
) )
elif roll == 2: elif roll == 2:
if var2 > var1: if var2 > var1:
var1, var2 = var2, var1 var1, var2 = var2, var1
answer = var1 - var2 answer = var1 - var2
puzzle += ( puzzle += "{} {} {}".format(
p.number_to_words(var1) p.number_to_words(var1),
+ " " random.choice(["minus", "subtract", "take away", "less"]),
+ random.choice(["minus", "subtract", "take away", "less"]) p.number_to_words(var2),
+ " "
+ p.number_to_words(var2)
) )
elif roll == 3: elif roll == 3:
if var2 > var1: if var2 > var1:
var1, var2 = var2, var1 var1, var2 = var2, var1
answer = var1 * 2 / var2 answer = var1 * 2 / var2
puzzle += ( puzzle += "{} {} {} (no remainder)".format(
p.number_to_words(var1 * 2) p.number_to_words(var1 * 2),
+ " " random.choice(["divided by", "over"]),
+ random.choice(["divided by", "over"]) p.number_to_words(var2),
+ " "
+ p.number_to_words(var2)
+ " (no remainder)"
) )
elif roll == 4: elif roll == 4:
answer = var1 ** var2 answer = var1 ** var2
puzzle += ( puzzle += "{} to the {} power".format(
p.number_to_words(var1) p.number_to_words(var1), p.ordinal(p.number_to_words(var2))
+ " to the "
+ p.ordinal(p.number_to_words(var2))
+ " power"
) )
elif roll == 5: elif roll == 5:
p1 = random.choice(primes) p1 = random.choice(primes)
p2 = random.choice(primes) p2 = random.choice(primes)
@ -103,10 +95,10 @@ def make_puzzle(obfuscate=True):
return attempt == correct return attempt == correct
bonus = 1 bonus = 1
puzzle += ( puzzle += "{} when factored into its two primes (answer in the form of the two primes with a comma between)".format(
p.number_to_words(p1 * p2) p.number_to_words(p1 * p2)
+ " when factored into its two primes (answer in the form of the two primes with a comma between)"
) )
elif roll == 6: elif roll == 6:
prime = random.choice(primes) prime = random.choice(primes)
answer = prime % var1 answer = prime % var1
@ -115,57 +107,43 @@ def make_puzzle(obfuscate=True):
if let1_ord + var1 > ord("z"): if let1_ord + var1 > ord("z"):
let1_ord -= var1 let1_ord -= var1
answer = chr(let1_ord + var1) answer = chr(let1_ord + var1)
puzzle = ( puzzle += "What letter comes {} letters after '{}'".format(
"What letter comes " p.number_to_words(var1), chr(let1_ord)
+ p.number_to_words(var1)
+ " letters after '"
+ chr(let1_ord)
+ "'"
) )
obfuscate = False obfuscate = False
elif roll == 8: elif roll == 8:
if let1_ord - var1 < ord("a"): if let1_ord - var1 < ord("a"):
let1_ord += var1 let1_ord += var1
answer = chr(let1_ord - var1) answer = chr(let1_ord - var1)
puzzle = ( puzzle += "What letter comes {} letters before '{}'".format(
"What letter comes " p.number_to_words(var1), chr(let1_ord)
+ p.number_to_words(var1)
+ " letters before '"
+ chr(let1_ord)
+ "'"
) )
obfuscate = False obfuscate = False
elif roll == 9: elif roll == 9:
answer, puzzle = quote_puzzle.get_quote() answer, puzzle = quote_puzzle.get_quote()
obfuscate = False obfuscate = False
elif roll == 10: elif roll == 10:
answer = str(min(var1, var2, var3, var4)) answer = str(min(var1, var2, var3, var4))
puzzle = ( puzzle += "What is the {} of {}, {}, {}, and {}".format(
"What is the " random.choice(["smallest", "lowest"]),
+ random.choice(["smallest", "lowest"]) p.number_to_words(var1),
+ " of " p.number_to_words(var2),
+ p.number_to_words(var1) p.number_to_words(var3),
+ ", " p.number_to_words(var4),
+ p.number_to_words(var2)
+ ", "
+ p.number_to_words(var3)
+ ", and "
+ p.number_to_words(var4)
) )
elif roll == 11: elif roll == 11:
answer = str(max(var1, var2, var3, var4)) answer = str(max(var1, var2, var3, var4))
puzzle = ( puzzle += "What is the {} of {}, {}, {}, and {}".format(
"What is the " random.choice(["biggest", "largest"]),
+ random.choice(["biggest", "largest"]) p.number_to_words(var1),
+ " of " p.number_to_words(var2),
+ p.number_to_words(var1) p.number_to_words(var3),
+ ", " p.number_to_words(var4),
+ p.number_to_words(var2)
+ ", "
+ p.number_to_words(var3)
+ ", and "
+ p.number_to_words(var4)
) )
elif roll <= 14: # 12-14 elif roll <= 14: # 12-14
answer, puzzle = dict_puzzle.get_puzzle() answer, puzzle = dict_puzzle.get_puzzle()
obfuscate = False obfuscate = False

View File

@ -31,7 +31,7 @@ parser.add_option(
"-n", "-n",
"--nick", "--nick",
dest="nick", dest="nick",
default="quote_bot", default="quotebot",
help="the nick to use", help="the nick to use",
metavar="NICK", metavar="NICK",
) )
@ -51,19 +51,10 @@ def haiku(channel):
util.sendmsg(ircsock, channel, h) util.sendmsg(ircsock, channel, h)
def get_user_from_message(msg):
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def say_mentions(user, message): def say_mentions(user, message):
nick = get_user_from_message(message) nick = util.get_user_from_message(message)
menschns = ( menschns = (
os.popen("/home/karlen/bin/mensch -u %s -t 24 -z +0" % (user)) os.popen("/home/karlen/bin/mensch -u {} -t 24 -z +0".format(user))
.read() .read()
.replace("\t", ": ") .replace("\t", ": ")
.split("\n") .split("\n")
@ -86,8 +77,8 @@ def say_chatty(channel):
def listen(): def listen():
while 1: while 1:
ircmsg = ircsock.recv(2048) ircmsg = ircsock.recv(2048).decode()
ircmsg = ircmsg.strip("\n\r") ircmsg = ircmsg.strip("\r\n")
formatted = util.format_message(ircmsg) formatted = util.format_message(ircmsg)
@ -96,7 +87,7 @@ def listen():
print(formatted) print(formatted)
time, user, messageText = formatted.split("\t") user = formatted.split("\t")[1]
if ircmsg.find(":!quote") != -1: if ircmsg.find(":!quote") != -1:
random_quote(options.channel) random_quote(options.channel)
@ -111,10 +102,10 @@ def listen():
haiku(options.channel) haiku(options.channel)
if ircmsg[:4] == "PING": if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1]) util.ping(ircsock, ircmsg)
sys.stdout.flush() sys.stdout.flush()
time.sleep(1) # time.sleep(1)
ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

View File

@ -1,124 +0,0 @@
#!/usr/bin/python
# http://wiki.shellium.org/w/Writing_an_IRC_bot_in_Python
# Import some necessary libraries.
import socket
import os
import sys
from optparse import OptionParser
import get_users
import mentions
import formatter
parser = OptionParser()
parser.add_option(
"-s",
"--server",
dest="server",
default="127.0.0.1",
help="the server to connect to",
metavar="SERVER",
)
parser.add_option(
"-c",
"--channel",
dest="channel",
default="#bot_test",
help="the channel to join",
metavar="CHANNEL",
)
parser.add_option(
"-n",
"--nick",
dest="nick",
default="tilde_bot",
help="the nick to use",
metavar="NICK",
)
(options, args) = parser.parse_args()
def ping(pong):
ircsock.send("PONG {}\n".format(pong))
def sendmsg(chan, msg):
ircsock.send("PRIVMSG " + chan + " :" + msg + "\n")
def joinchan(chan):
ircsock.send("JOIN " + chan + "\n")
def hello():
ircsock.send("PRIVMSG " + channel + " :Hello!\n")
def tilde(channel, user, time):
# h = os.popen("haiku").read().replace("\n", " // ")
msg = time + ":" + user
print(msg)
ircsock.send("PRIVMSG " + channel + " :" + msg + "\n")
def connect(server, channel, botnick):
ircsock.connect((server, 6667))
ircsock.send(
"USER "
+ botnick
+ " "
+ botnick
+ " "
+ botnick
+ " :This bot is a result of a tutoral covered on http://shellium.org/wiki.\n"
) # user authentication
ircsock.send("NICK " + botnick + "\n")
joinchan(channel)
def get_user_from_message(msg):
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def listen():
while 1:
ircmsg = ircsock.recv(2048)
ircmsg = ircmsg.strip("\n\r")
if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1])
formatted = formatter.format_message(ircmsg)
if "" == formatted:
continue
print(formatted)
split = formatted.split("\t")
time = split[0]
user = split[1]
messageText = split[2]
if ircmsg.find(":!tilde") != -1:
tilde(options.channel, user, time)
if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1])
sys.stdout.flush()
ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect(options.server, options.channel, options.nick)
listen()

View File

@ -48,7 +48,7 @@ challenges = {}
SCORE_FILE = "tildescores.txt" SCORE_FILE = "tildescores.txt"
JACKPOT_FILE = "tildejackpot.txt" JACKPOT_FILE = "tildejackpot.txt"
JACKPOT_MIN = 3 JACKPOT_MIN = 3
DEBUG = False DEBUG = True
def too_recent(time1, time2): def too_recent(time1, time2):
@ -190,7 +190,7 @@ def get_prize(name, isHuman, bonus=0):
prize, prize,
"{}: {}! You are {} and get {} tildes!".format( "{}: {}! You are {} and get {} tildes!".format(
name, name,
(get_positive() if isHuman else get_negative), (get_positive() if isHuman else get_negative()),
get_superlative(prize), get_superlative(prize),
p.number_to_words(prize), p.number_to_words(prize),
), ),
@ -240,10 +240,10 @@ def give_tilde(channel, user, name, time, human, bonus=0):
scorefile.seek(0) scorefile.seek(0)
scorefile.truncate() scorefile.truncate()
for score in scores: for score in scores:
person = score.strip("\n").split("&^%") name, score_on_file, timestamp = score.strip("\n").split("&^%")
if person[0] == user: if name == user:
found = True found = True
if too_recent(time, person[2]) and not DEBUG: if too_recent(time, timestamp) and not DEBUG:
util.sendmsg( util.sendmsg(
ircsock, ircsock,
channel, channel,
@ -252,22 +252,22 @@ def give_tilde(channel, user, name, time, human, bonus=0):
), ),
) )
else: else:
prize = get_prize(name, human, bonus) prizevalue, prizetext = get_prize(name, human, bonus)
score = "{}&^%{}&^%{}\n".format( score = "{}&^%{}&^%{}\n".format(
person[0], int(person[1] + prize[0]), time name, str(int(score_on_file) + prizevalue), time
) )
util.sendmsg(ircsock, channel, prize[1]) util.sendmsg(ircsock, channel, prizetext)
scorefile.write(score) scorefile.write(score)
if not found: if not found:
prize = get_prize(name, True, bonus) prizevalue, prizetext = get_prize(name, True, bonus)
util.sendmsg( util.sendmsg(
ircsock, ircsock,
channel, channel,
"Welcome to the tilde game! Here's {} free tilde(s) to start you off.".format( "Welcome to the tilde game! Here's {} free tildes to start you off.".format(
p.number_to_words(prize[0] + 1) p.number_to_words(prizevalue + 1)
), ),
) )
scorefile.write("{}&^%{}&^%{}\n".format(user, str(prize[0] + 1), time)) scorefile.write("{}&^%{}&^%{}\n".format(user, str(prizevalue + 1), time))
def show_tildescore(channel, user, name): def show_tildescore(channel, user, name):
@ -298,14 +298,13 @@ def challenge(channel, user, name, time):
global challenges global challenges
challenge = puzzle.make_puzzle() challenge = puzzle.make_puzzle()
challenges[user] = challenge[1:] challenges[user] = challenge[1:]
# challenges[USER] = [ANSWER, BONUS] util.sendmsg(ircsock, channel, "{}: {}".format(name, challenge[0]))
util.sendmsg(ircsock, channel, "{}: {}".format(name, challenge[1]))
def challenge_response(channel, user, name, time, msg): def challenge_response(channel, user, name, time, msg):
global challenges global challenges
print(msg) print(msg)
if challenges.has_key(user): if user in challenges:
answer, bonus = challenges[user] answer, bonus = challenges[user]
if (callable(answer) and answer(msg.lower())) or ( if (callable(answer) and answer(msg.lower())) or (
msg.lower() == str(answer).lower() or msg == p.number_to_words(answer) msg.lower() == str(answer).lower() or msg == p.number_to_words(answer)
@ -323,31 +322,10 @@ def rollcall(channel):
) )
def connect(server, channel, botnick):
server, port = server.split(":")
ircsock.connect((server, port))
ircsock.send("USER {0} {0} {0} :krowbar\r\n".format(botnick)) # user authentication
ircsock.send("NICK {}\r\n".format(botnick))
ircsock.send("MODE +B {}\r\n".format(botnick))
joinchan(channel)
if not DEBUG:
joinchan("#bots")
def get_user_from_message(msg):
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def listen(): def listen():
while 1: while 1:
ircmsg = ircsock.recv(2048) ircmsg = ircsock.recv(2048).decode()
for msg in ircmsg.split("\n"): for msg in ircmsg.split("\n"):
msg = msg.strip("\n\r") msg = msg.strip("\n\r")
@ -356,20 +334,19 @@ def listen():
continue continue
formatted = util.format_message(msg) formatted = util.format_message(msg)
print(formatted)
if "" == formatted: if "" == formatted:
continue continue
# print formatted
iTime, user, command, channel, messageText = formatted.split("\t") iTime, user, command, channel, messageText = formatted.split("\t")
name = util.get_name(user) name = util.get_name(user)
if msg.find(":!tildescore") != -1: if msg.find(":!tildescore") != -1:
show_tildescore(channel, user, name) show_tildescore(channel, user, name)
elif msg.find(":!tilde") != -1 and not challenges.has_key(user): elif msg.find(":!tilde") != -1 and user not in challenges:
challenge(channel, user, name, iTime) challenge(channel, user, name, iTime)
elif challenges.has_key(user) and (channel == "#bots" or DEBUG): elif user in challenges and (channel == "#bots" or DEBUG):
challenge_response(channel, user, name, iTime, messageText) challenge_response(channel, user, name, iTime, messageText)
if msg.find(":!jackpot") != -1: if msg.find(":!jackpot") != -1:

View File

@ -0,0 +1 @@
111

View File

@ -122,14 +122,4 @@ x4464&^%1&^%1532028546
pounce&^%19&^%1532133325 pounce&^%19&^%1532133325
von_&^%5&^%1532502104 von_&^%5&^%1532502104
livix&^%7&^%1533603142 livix&^%7&^%1533603142
ben&^%3&^%1533767627 ben&^%28&^%1539065026
npa&^%78&^%1536235183
ezo&^%6&^%1533883842
aliasless&^%30&^%1537198276
kirch&^%41&^%1535571833
root&^%2&^%1535558514
byte&^%5&^%1536416308
qbe&^%6&^%1537112151
informati&^%3&^%1536733938
h00fi&^%1&^%1537050053
fantoro&^%4&^%1537106482

View File

@ -10,12 +10,8 @@ import fileinput
import random import random
import time import time
import formatter
import get_users
import mentions
import pretty_date
import inflect import inflect
import names import util
parser = OptionParser() parser = OptionParser()
@ -23,7 +19,7 @@ parser.add_option(
"-s", "-s",
"--server", "--server",
dest="server", dest="server",
default="127.0.0.1", default="127.0.0.1:6667",
help="the server to connect to", help="the server to connect to",
metavar="SERVER", metavar="SERVER",
) )
@ -49,22 +45,6 @@ parser.add_option(
p = inflect.engine() p = inflect.engine()
def ping(pong):
ircsock.send("PONG {}\n".format(pong))
def sendmsg(chan, msg):
ircsock.send("PRIVMSG " + chan + " :" + msg + "\n")
def joinchan(chan):
ircsock.send("JOIN " + chan + "\n")
def hello():
ircsock.send("PRIVMSG " + channel + " :Hello!\n")
def get_topic(channel, user, time): def get_topic(channel, user, time):
# topic scores are saved as <USER>&^%<GETS SCORE>&^%<SETS SCORE> # topic scores are saved as <USER>&^%<GETS SCORE>&^%<SETS SCORE>
with open("topicscores.txt", "r") as scorefile: with open("topicscores.txt", "r") as scorefile:
@ -84,19 +64,16 @@ def get_topic(channel, user, time):
with open("topics_" + channel + ".txt", "r") as topics: with open("topics_" + channel + ".txt", "r") as topics:
topic = topics.readlines()[-1].strip("\n").split("&^%", 3) topic = topics.readlines()[-1].strip("\n").split("&^%", 3)
byuser = names.get_name(topic[1]) byuser = util.get_name(topic[1])
ircsock.send( util.sendmsg(
"PRIVMSG " ircsock,
+ channel channel,
+ " :I've told you " "I've told you {} times! It's \"{}\" (set by {} {})".format(
+ p.number_to_words(userscore) p.number_to_words(userscore),
+ " times! It's \"" topic[2],
+ topic[2] byuser,
+ '" (Set by ' util.pretty_date(int(topic[0])),
+ byuser ),
+ " "
+ pretty_date.pretty_date(int(topic[0]))
+ ")\n"
) )
@ -117,14 +94,10 @@ def count_topic(channel, user, time, msg):
scorefile.writelines(scores) scorefile.writelines(scores)
if not found: if not found:
scorefile.write(user + "&^%0&^%1") scorefile.write(user + "&^%0&^%1")
ircsock.send( util.sendmsg(
"PRIVMSG " ircsock,
+ channel channel,
+ " :" "{} has changed the topic {} times!".format(user, p.number_to_words(userscore)),
+ user
+ " has changed the topic "
+ p.number_to_words(userscore)
+ " times!\n"
) )
@ -139,29 +112,29 @@ def random_topic(channel, user, time, setTopic=False):
if setTopic: if setTopic:
set_topic(channel, user, time, msg) set_topic(channel, user, time, msg)
else: else:
ircsock.send("PRIVMSG " + channel + " :Suggested Topic: " + msg + "\n") util.sendmsg(ircsock, channel, "Suggested Topic: {}".format(msg))
def rollcall(channel): def rollcall(channel):
ircsock.send( util.sendmsg(
"PRIVMSG " ircsock,
+ channel channel,
+ " :topicbot reporting! I respond to !topic !settopic !suggesttopic !thistory\n" "topicbot reporting! I respond to !topic !settopic !suggesttopic !thistory",
) )
def topic_score(channel): def topic_score(channel):
ircsock.send("PRIVMSG " + channel + " :Not implemented yet") util.sendmsg(ircsock, channel, "Not implemented yet")
def topic_scores(channel): def topic_scores(channel):
ircsock.send("PRIVMSG " + channel + " :Not implemented yet") util.sendmsg(ircsock, channel, "Not implemented yet")
def topic_history(channel, user, count): def topic_history(channel, user, count):
try: try:
iCount = int(count.split()[1]) iCount = int(count.split()[1])
except (ValueError, IndexError) as e: except (ValueError, IndexError):
iCount = 3 iCount = 3
if iCount > 10: if iCount > 10:
iCount = 10 iCount = 10
@ -169,73 +142,40 @@ def topic_history(channel, user, count):
iCount = 3 iCount = 3
with open("topics_" + channel + ".txt", "r") as topicsfile: with open("topics_" + channel + ".txt", "r") as topicsfile:
# topics = topicsfile.readlines()[-iCount:].reverse() # topics = topicsfile.readlines()[-iCount:].reverse()
ircsock.send( util.sendmsg(
"PRIVMSG " ircsock,
+ channel channel,
+ " :Ok, here were the last " "Ok, here are the last {} topics".format(p.number_to_words(iCount)),
+ p.number_to_words(iCount)
+ " topics\n"
) )
for idx, topic in enumerate(reversed(topicsfile.readlines()[-iCount:])): for idx, topic in enumerate(reversed(topicsfile.readlines()[-iCount:])):
topic = topic.strip("\n").split("&^%", 3) topic = topic.strip("\n").split("&^%", 3)
byuser = names.get_name(topic[1]) byuser = util.get_name(topic[1])
ircsock.send( util.sendmsg(
"PRIVMSG " ircsock,
+ channel channel,
+ " :" "{}: {} (set by {} {})".format(
+ str(idx + 1) str(idx + 1), topic[2], byuser, util.pretty_date(int(topic[0]))
+ ': "' ),
+ topic[2]
+ '" (Set by '
+ byuser
+ " "
+ pretty_date.pretty_date(int(topic[0]))
+ ")\n"
) )
def connect(server, channel, botnick):
ircsock.connect((server, 6667))
ircsock.send(
"USER " + botnick + " " + botnick + " " + botnick + " :krowbar\n"
) # user authentication
ircsock.send("NICK " + botnick + "\n")
joinchan(channel)
joinchan("#bots")
def get_user_from_message(msg):
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def listen(): def listen():
while 1: while 1:
ircmsg = ircsock.recv(2048) ircmsg = ircsock.recv(2048).decode()
ircmsg = ircmsg.strip("\n\r") ircmsg = ircmsg.strip("\n\r")
if ircmsg[:4] == "PING": if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1]) util.ping(ircsock, ircmsg)
formatted = formatter.format_message(ircmsg) formatted = util.format_message(ircmsg)
if "" == formatted: if "" == formatted:
continue continue
# print formatted # print formatted
split = formatted.split("\t") msgtime, user, command, channel, messageText = formatted.split("\t")
msgtime = split[0]
user = split[1]
command = split[2]
channel = split[3]
messageText = split[4]
if command == "TOPIC" and user != options.nick: if command == "TOPIC" and user != options.nick:
count_topic(channel, user, msgtime, messageText) count_topic(channel, user, msgtime, messageText)
@ -262,13 +202,10 @@ def listen():
if ircmsg.find(":!rollcall") != -1: if ircmsg.find(":!rollcall") != -1:
rollcall(channel) rollcall(channel)
if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1])
sys.stdout.flush() sys.stdout.flush()
time.sleep(1) time.sleep(1)
ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect(options.server, options.channel, options.nick) util.connect(ircsock, options)
listen() listen()

View File

@ -1 +1,2 @@
vilmibm&^%0&^%2 vilmibm&^%0&^%2
ben&^%3&^%0

View File

@ -4,30 +4,44 @@ import random
import re import re
def hello(ircsock, chan): def ping(ircsock, msg):
sendmsg(ircsock, chan, "Hello!") ircsock.send("PONG {}\n".format(msg.split(" ")[1]).encode())
def ping(pong):
ircsock.send("PONG {}\n".format(pong.split(" ")[1]))
def sendmsg(ircsock, chan, msg): def sendmsg(ircsock, chan, msg):
ircsock.send("PRIVMSG {} :{}\r\n".format(chan, msg)) print("sending {} to {}".format(msg, chan))
ircsock.send("PRIVMSG {} :{}\r\n".format(chan, msg).encode())
def joinchan(ircsock, chan): def joinchan(ircsock, chan):
ircsock.send("JOIN {}\r\n".format(chan)) print("joining {}".format(chan))
ircsock.send("JOIN {}\r\n".format(chan).encode())
def get_user_from_message(msg):
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def connect(ircsock, options): def connect(ircsock, options):
server, channel, botnick = options print(options)
server, port = server.split(":") server, port = options.server.split(":")
ircsock.connect((server, port)) ircsock.connect((server, int(port)))
ircsock.send("USER {0} {0} {0} :krowbar".format(botnick)) print(ircsock)
ircsock.send("NICK {}\r\n".format(botnick)) nick = "NICK {}\r\n".format(options.nick).encode()
ircsock.send("MODE +B {}\r\n".format(botnick)) print(nick)
joinchan(channel) ircsock.send(nick)
login = "USER {0} {0} {0} {0}".format(options.nick).encode()
print(login)
ircsock.send(login)
mode = "MODE +B {}\r\n".format(options.nick).encode()
print(mode)
ircsock.send(mode)
joinchan(ircsock, options.channel)
# integer number to english word conversion # integer number to english word conversion

View File

@ -37,7 +37,7 @@ parser.add_option(
"-n", "-n",
"--nick", "--nick",
dest="nick", dest="nick",
default="numberwang_bot", default="wangbot",
help="the nick to use", help="the nick to use",
metavar="NICK", metavar="NICK",
) )
@ -274,27 +274,18 @@ def rollcall(channel):
util.sendmsg( util.sendmsg(
ircsock, ircsock,
channel, channel,
" :Is it time for Numberwang? It might be! Start a new game with !numberwang or stop a current game with !wangernumb Get your score with !myscore and the list of top wangers with !topwangers", "Is it time for Numberwang? It might be! Start a new game with !numberwang or stop a current game with !wangernumb Get your score with !myscore and the list of top wangers with !topwangers",
) )
def get_user_from_message(msg):
try:
i1 = msg.index(":") + 1
i2 = msg.index("!")
return msg[i1:i2]
except ValueError:
return ""
def listen(): def listen():
while 1: while 1:
ircmsg = ircsock.recv(2048) ircmsg = ircsock.recv(2048).decode()
ircmsg = ircmsg.strip("\n\r") ircmsg = ircmsg.strip("\n\r")
if ircmsg[:4] == "PING": if ircmsg[:4] == "PING":
ping(ircmsg.split(" ")[1]) util.ping(ircsock, ircmsg)
formatted = util.format_message(ircmsg) formatted = util.format_message(ircmsg)
@ -303,7 +294,7 @@ def listen():
# print formatted # print formatted
time, user, command, channel, messageText = formatted.split("\t") _time, user, _command, channel, messageText = formatted.split("\t")
if ircmsg.find(":!numberwang") != -1 and roundsLeft == 0: if ircmsg.find(":!numberwang") != -1 and roundsLeft == 0:
start_numberwang(channel, user) start_numberwang(channel, user)