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 ede4dca9b1dccc6b55861062daea277df26ba415..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
@@
-135,12
+136,12
@@
def handle_command(command, argument, notice, target, session):
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")
@@
-158,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()
@@
-167,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:
@@
-175,20
+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:
if len(results) > 3:
else:
if len(results) > 3:
- notice("
SHOWING 3 OF " + str(len(results)) + " QUOTES
")
+ notice("
showing 3 of " + str(len(results)) + " quotes
")
for result in results[:3]:
for result in results[:3]:
- notice("
QUOTE
#" + str(result[0] + 1) + ": "
+ notice("
quote
#" + str(result[0] + 1) + ": "
+ result[1][:-1])
return
else:
i = random.randrange(len(lines))
+ result[1][:-1])
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
@@
-215,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.
@@
-230,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
@@
-298,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
@@
-313,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()
@@
-338,8
+339,16
@@
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
, stream=True)
+ 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:
r.raw.decode_content = True
text = r.raw.read(10000000+1)
if len(text) > 10000000:
@@
-347,22
+356,25
@@
def handle_url(url, notice, show_url=False):
except (requests.exceptions.TooManyRedirects,
requests.exceptions.ConnectionError,
requests.exceptions.InvalidURL,
except (requests.exceptions.TooManyRedirects,
requests.exceptions.ConnectionError,
requests.exceptions.InvalidURL,
-
requests.exceptions.ReadTimeo
ut,
+
TimeO
ut,
UnicodeError,
ValueError,
requests.exceptions.InvalidSchema) as error:
UnicodeError,
ValueError,
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
+ return
True
title = bs4.BeautifulSoup(text, "html5lib").title
if title and title.string:
title = bs4.BeautifulSoup(text, "html5lib").title
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:
@@
-417,8
+429,14
@@
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:])
if "!" == msg[0]:
tokens = msg[1:].split()
argument = str.join(" ", tokens[1:])