home
·
contact
·
privacy
projects
/
plomlombot-irc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Lowercase bot messages.
[plomlombot-irc.git]
/
plomlombot.py
diff --git
a/plomlombot.py
b/plomlombot.py
index b7829d2b9992ec230d5602772b1959641a52d0fd..b5db868f7bcba32a561a9f63fdcfe9dfd0f091ac 100755
(executable)
--- a/
plomlombot.py
+++ b/
plomlombot.py
@@
-11,6
+11,7
@@
import bs4
import random
import hashlib
import os
import random
import hashlib
import os
+import signal
import plomsearch
import irclog
import plomsearch
import irclog
@@
-24,6
+25,12
@@
TWTFILE = ""
DBDIR = os.path.expanduser("~/plomlombot_db")
DBDIR = os.path.expanduser("~/plomlombot_db")
+def write_to_file(path, mode, text):
+ f = open(path, mode)
+ f.write(text)
+ f.close()
+
+
class ExceptionForRestart(Exception):
pass
class ExceptionForRestart(Exception):
pass
@@
-123,21
+130,18
@@
def handle_command(command, argument, notice, target, session):
def addquote():
if not os.access(session.quotesfile, os.F_OK):
def addquote():
if not os.access(session.quotesfile, os.F_OK):
- quotesfile = open(session.quotesfile, "w")
- quotesfile.write("QUOTES FOR " + target + ":\n")
- quotesfile.close()
- quotesfile = open(session.quotesfile, "a")
- quotesfile.write(argument + "\n")
- quotesfile.close()
+ write_to_file(session.quotesfile, "w",
+ "QUOTES FOR " + target + ":\n")
+ write_to_file(session.quotesfile, "a", argument + "\n")
quotesfile = open(session.quotesfile, "r")
lines = quotesfile.readlines()
quotesfile.close()
quotesfile = open(session.quotesfile, "r")
lines = quotesfile.readlines()
quotesfile.close()
- notice("
ADDED QUOTE
#" + str(len(lines) - 1))
+ notice("
added quote
#" + str(len(lines) - 1))
def quote():
def help():
def quote():
def help():
- notice("
SYNTAX
: !quote [int] OR !quote search QUERY")
+ notice("
syntax
: !quote [int] OR !quote search QUERY")
notice("QUERY may be a boolean grouping of quoted or unquoted " +
"search terms, examples:")
notice("!quote search foo")
notice("QUERY may be a boolean grouping of quoted or unquoted " +
"search terms, examples:")
notice("!quote search foo")
@@
-155,7
+159,7
@@
def handle_command(command, argument, notice, target, session):
help()
return
if not os.access(session.quotesfile, os.F_OK):
help()
return
if not os.access(session.quotesfile, os.F_OK):
- notice("
NO QUOTES AVAILABLE
")
+ notice("
no quotes available
")
return
quotesfile = open(session.quotesfile, "r")
lines = quotesfile.readlines()
return
quotesfile = open(session.quotesfile, "r")
lines = quotesfile.readlines()
@@
-164,7
+168,7
@@
def handle_command(command, argument, notice, target, session):
if len(tokens) == 1:
i = int(tokens[0])
if i == 0 or i > len(lines):
if len(tokens) == 1:
i = int(tokens[0])
if i == 0 or i > len(lines):
- notice("
THERE'S NO QUOTE OF THAT INDEX
")
+ notice("
there's no quote of that index
")
return
i = i - 1
elif len(tokens) > 1:
return
i = i - 1
elif len(tokens) > 1:
@@
-172,18
+176,20
@@
def handle_command(command, argument, notice, target, session):
try:
results = plomsearch.search(query, lines)
except plomsearch.LogicParserError as err:
try:
results = plomsearch.search(query, lines)
except plomsearch.LogicParserError as err:
- notice("
FAILED QUERY PARSING
: " + str(err))
+ notice("
failed query parsing
: " + str(err))
return
if len(results) == 0:
return
if len(results) == 0:
- notice("
NO QUOTES MATCHING QUERY
")
+ notice("
no quotes matching query
")
else:
else:
- for result in results:
- notice("QUOTE #" + str(result[0] + 1) + " : "
- + result[1][-1])
+ if len(results) > 3:
+ notice("showing 3 of " + str(len(results)) + " quotes")
+ for result in results[:3]:
+ notice("quote #" + str(result[0] + 1) + ": "
+ + result[1][:-1])
return
else:
i = random.randrange(len(lines))
return
else:
i = random.randrange(len(lines))
- notice("
QUOTE
#" + str(i + 1) + ": " + lines[i][:-1])
+ notice("
quote
#" + str(i + 1) + ": " + lines[i][:-1])
def markov():
from random import choice, shuffle
def markov():
from random import choice, shuffle
@@
-210,7
+216,7
@@
def handle_command(command, argument, notice, target, session):
return selection[select_length]
if not os.access(session.markovfile, os.F_OK):
return selection[select_length]
if not os.access(session.markovfile, os.F_OK):
- notice("
NOT ENOUGH TEXT TO MARKOV.
")
+ notice("
not enough text to markov
")
return
# Lowercase incoming lines, ensure they end in a sentence end mark.
return
# Lowercase incoming lines, ensure they end in a sentence end mark.
@@
-225,7
+231,7
@@
def handle_command(command, argument, notice, target, session):
line += "."
tokens += line.split()
if len(tokens) <= select_length:
line += "."
tokens += line.split()
if len(tokens) <= select_length:
- notice("
NOT ENOUGH TEXT TO MARKOV.
")
+ notice("
not enough text to markov
")
return
# Replace URLs with escape string for now, so that the Markov selector
return
# Replace URLs with escape string for now, so that the Markov selector
@@
-293,7
+299,7
@@
def handle_command(command, argument, notice, target, session):
try:
twtfile = open(session.twtfile, mode)
except (PermissionError, FileNotFoundError) as err:
try:
twtfile = open(session.twtfile, mode)
except (PermissionError, FileNotFoundError) as err:
- notice("
CAN'T ACCESS OR CREATE TWT FILE
: " + str(err))
+ notice("
can't access or create twt file
: " + str(err))
return None
return twtfile
return None
return twtfile
@@
-308,7
+314,7
@@
def handle_command(command, argument, notice, target, session):
return
twtfile.write(datetime.utcnow().isoformat() + "\t" + argument + "\n")
twtfile.close()
return
twtfile.write(datetime.utcnow().isoformat() + "\t" + argument + "\n")
twtfile.close()
- notice("
WROTE TWT
.")
+ notice("
wrote twt
.")
if "addquote" == command:
addquote()
if "addquote" == command:
addquote()
@@
-333,25
+339,42
@@
def handle_url(url, notice, show_url=False):
handle_url(url, notice, True)
return True
handle_url(url, notice, True)
return True
+ class TimeOut(Exception):
+ pass
+
+ def timeout_handler(ignore1, ignore2):
+ raise TimeOut("timeout")
+
+ signal.signal(signal.SIGALRM, timeout_handler)
+ signal.alarm(15)
try:
try:
- r = requests.get(url, timeout=15)
+ r = requests.get(url, headers = {'User-Agent': 'plomlombot'}, stream=True)
+ r.raw.decode_content = True
+ text = r.raw.read(10000000+1)
+ if len(text) > 10000000:
+ raise ValueError('Too large a response')
except (requests.exceptions.TooManyRedirects,
requests.exceptions.ConnectionError,
requests.exceptions.InvalidURL,
except (requests.exceptions.TooManyRedirects,
requests.exceptions.ConnectionError,
requests.exceptions.InvalidURL,
+ TimeOut,
UnicodeError,
UnicodeError,
+ ValueError,
requests.exceptions.InvalidSchema) as error:
requests.exceptions.InvalidSchema) as error:
- notice("TROUBLE FOLLOWING URL: " + str(error))
- return
+ signal.alarm(0)
+ notice("trouble following url: " + str(error))
+ return False
+ signal.alarm(0)
if mobile_twitter_hack(url):
if mobile_twitter_hack(url):
- return
- title = bs4.BeautifulSoup(
r.
text, "html5lib").title
+ return
True
+ title = bs4.BeautifulSoup(text, "html5lib").title
if title and title.string:
if title and title.string:
- prefix = "
PAGE TITLE
: "
+ prefix = "
page title
: "
if show_url:
if show_url:
- prefix = "
PAGE TITLE FOR
<" + url + ">: "
+ prefix = "
page title for
<" + url + ">: "
notice(prefix + title.string.strip())
else:
notice(prefix + title.string.strip())
else:
- notice("PAGE HAS NO TITLE TAG")
+ notice("page has no title tag")
+ return True
class Session:
class Session:
@@
-386,15
+409,13
@@
class Session:
line = Line(":" + self.nickname + "!~" + self.username +
"@localhost" + " " + line)
now = datetime.datetime.utcnow()
line = Line(":" + self.nickname + "!~" + self.username +
"@localhost" + " " + line)
now = datetime.datetime.utcnow()
- logfile = open(self.rawlogdir + now.strftime("%Y-%m-%d") + ".txt", "a")
form = "%Y-%m-%d %H:%M:%S UTC\t"
form = "%Y-%m-%d %H:%M:%S UTC\t"
- logfile.write(now.strftime(form) + " " + line.line + "\n")
-
logfile.close(
)
+ write_to_file(self.rawlogdir + now.strftime("%Y-%m-%d") + ".txt",
+
"a", now.strftime(form) + " " + line.line + "\n"
)
to_log = irclog.format_logline(line, self.channel)
if to_log != None:
to_log = irclog.format_logline(line, self.channel)
if to_log != None:
- logfile = open(self.logdir + now.strftime("%Y-%m-%d") + ".txt", "a")
- logfile.write(now.strftime(form) + " " + to_log + "\n")
- logfile.close()
+ write_to_file(self.logdir + now.strftime("%Y-%m-%d") + ".txt",
+ "a", now.strftime(form) + " " + to_log + "\n")
def handle_privmsg(line):
def handle_privmsg(line):
@@
-408,17
+429,24
@@
class Session:
target = line.receiver
msg = str.join(" ", line.tokens[3:])[1:]
matches = re.findall("(https?://[^\s>]+)", msg)
target = line.receiver
msg = str.join(" ", line.tokens[3:])[1:]
matches = re.findall("(https?://[^\s>]+)", msg)
+ url_count = 0
for i in range(len(matches)):
for i in range(len(matches)):
- handle_url(matches[i], notice)
+ if handle_url(matches[i], notice):
+ url_count += 1
+ if url_count == 3:
+ notice("maximum number of urls to parse per message "
+ "reached")
+ break
if "!" == msg[0]:
tokens = msg[1:].split()
argument = str.join(" ", tokens[1:])
handle_command(tokens[0], argument, notice, target, self)
return
if "!" == msg[0]:
tokens = msg[1:].split()
argument = str.join(" ", tokens[1:])
handle_command(tokens[0], argument, notice, target, self)
return
- file = open(self.markovfile, "a")
- file.write(msg + "\n")
- file.close()
+ write_to_file(self.markovfile, "a", msg + "\n")
+ now = datetime.datetime.utcnow()
+ write_to_file(self.logdir + now.strftime("%Y-%m-%d") + ".txt", "a",
+ "-----------------------\n")
while True:
if self.rmlogs > 0:
for f in os.listdir(self.logdir):
while True:
if self.rmlogs > 0:
for f in os.listdir(self.logdir):