From 5f6ab65e4c681a8d8bc90a67b1cbfebe22d51783 Mon Sep 17 00:00:00 2001 From: Jordan Doyle Date: Sun, 23 Jul 2017 00:42:04 +0100 Subject: [PATCH] Port to python3 --- requirements.txt | 21 +++++++++++---------- dave/config.py | 4 ---- dave/dave.py | 14 ++++++-------- dave/module.py | 2 -- dave/modules/cryptocurrency.py | 15 ++++++++++----- dave/modules/help.py | 4 ++-- dave/modules/nice.py | 2 +- dave/modules/pollen.py | 10 +++------- dave/modules/sed.py | 14 +++++++------- dave/modules/seen.py | 1 - dave/modules/title.py | 4 ++-- dave/modules/urbandictionary.py | 4 ++-- dave/modules/weather.py | 2 +- dave/modules/wolfram.py | 17 ++++++++++------- 14 files changed, 52 insertions(+), 62 deletions(-) diff --git a/requirements.txt b/requirements.txt index 98e962c..45637eb 100644 --- a/requirements.txt +++ a/requirements.txt @@ -1,18 +1,17 @@ twisted==17.5.0 pyopenssl==16.2.0 -service_identity==16.0.0 +service_identity==17.0.0 enum34==1.1.6 -beautifulsoup4==4.4.1 -mechanize==0.2.5 +beautifulsoup4==4.6.0 requests==2.18.1 hiredis==0.2.0 redis==2.10.5 -arrow==0.7.0 -sqlalchemy==1.0.13 -alembic==0.8.6 -psycopg2==2.6.1 -lxml==3.6.0 -pysocks==1.5.7 -wolframalpha==2.4 -babel==2.3.4 +arrow==0.10.0 +sqlalchemy==1.1.11 +alembic==0.9.3 +psycopg2==2.7.2 +lxml==3.8.0 +pysocks==1.6.7 +wolframalpha==3.0 +babel==2.4.0 humanize==0.5.1diff --git a/dave/config.py b/dave/config.py index b1e7a6c..552863a 100644 --- a/dave/config.py +++ a/dave/config.py @@ -1,12 +1,8 @@ import redis import json import os.path from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -import socket -import markovify -import nltk -import re # read the config file basepath = os.path.dirname(__file__) diff --git a/dave/dave.py b/dave/dave.py index 96279b2..5c1f682 100644 --- a/dave/dave.py +++ a/dave/dave.py @@ -5,16 +5,15 @@ from twisted.python import log import time import pkgutil -import modules +import dave.modules as modules import re -import config -import datetime +import dave.config as config from twisted.internet import reactor from twisted.internet.threads import deferToThread class Dave(irc.IRCClient): - nickname = bytes(config.config["irc"]["nick"]) + nickname = config.config["irc"]["nick"] def connectionMade(self): irc.IRCClient.connectionMade(self) @@ -31,7 +30,7 @@ self.mode(self.nickname, True, "B") for channel in config.config["irc"]["channels"]: - self.join(bytes(channel)) + self.join(channel) if config.config["irc"]["nickserv_password"]: self.msg("nickserv", "identify {}".format(config.config["irc"]["nickserv_password"])) @@ -53,7 +52,7 @@ for importer, modname, ispkg in pkgutil.iter_modules(path, prefix): m = importer.find_module(modname).load_module(modname) - for name, val in m.__dict__.iteritems(): + for name, val in m.__dict__.items(): if callable(val) and hasattr(val, "rule"): priority = val.priority.value if hasattr(val, "priority") else 0 @@ -88,7 +87,7 @@ self.join(params[1]) def reply(self, source, sender, msg): - self.msg(source, "{}: {}".format(sender, msg.encode("utf-8"))) + self.msg(source, "{}: {}".format(sender, msg)) def main(): @@ -98,5 +97,4 @@ factory.protocol = Dave reactor.connectSSL(config.config["irc"]["host"], config.config["irc"]["port"], factory, ssl.ClientContextFactory()) - reactor.suggestThreadPoolSize(30) reactor.run() diff --git a/dave/module.py b/dave/module.py index 34518fc..905e54c 100644 --- a/dave/module.py +++ a/dave/module.py @@ -1,9 +1,7 @@ # -*- coding: utf-8 -*- """Provide various decorators for dave modules.""" import re from enum import Enum -import socket -import config def match(value): diff --git a/dave/modules/cryptocurrency.py b/dave/modules/cryptocurrency.py index b7477b7..44cadc4 100644 --- a/dave/modules/cryptocurrency.py +++ a/dave/modules/cryptocurrency.py @@ -49,12 +49,12 @@ multiplier = decimal.Decimal(1) total_volume = sum( - float(market['volume']) for market in p[cryptoKey][currencyKey].itervalues() + float(market['volume']) for market in p[cryptoKey][currencyKey].values() ) avg = sum( float(market['last']) * float(market['volume']) / total_volume - for market in p[cryptoKey][currencyKey].itervalues() + for market in p[cryptoKey][currencyKey].values() ) prices = assembleFormattedText(A.normal[ @@ -65,16 +65,16 @@ market, babel.numbers.format_currency(decimal.Decimal(data['last']) * multiplier, currency) - ).encode('utf-8') for market, data in p[cryptoKey][currencyKey].iteritems() + ) for market, data in p[cryptoKey][currencyKey].items() ]) ]) prices += u'. average: {}'.format( babel.numbers.format_currency(decimal.Decimal(avg) * multiplier, currency) - ).encode('utf-8') + ) - bot.reply(source, sender, prices.decode('utf-8')) + bot.reply(source, sender, prices) def preev(cryptocurrency, currency): """Contact the preev api and get the latest prices and cache for 10 seconds""" @@ -87,7 +87,10 @@ currency )) - json = r.json() + try: + json = r.json() + except: + return r.text dave.config.redis.setex(key, 10, pickle.dumps(json)) else: diff --git a/dave/modules/help.py b/dave/modules/help.py index bc131c4..6dbf41b 100644 --- a/dave/modules/help.py +++ a/dave/modules/help.py @@ -16,7 +16,7 @@ for importer, modname, ispkg in pkgutil.iter_modules(path, prefix): m = importer.find_module(modname).load_module(modname) - for name, val in m.__dict__.iteritems(): + for name, val in m.__dict__.items(): if callable(val) and hasattr(val, "help"): reply.append(val.help["name"]) @@ -34,7 +34,7 @@ for importer, modname, ispkg in pkgutil.iter_modules(path, prefix): m = importer.find_module(modname).load_module(modname) - for name, val in m.__dict__.iteritems(): + for name, val in m.__dict__.items(): if callable(val) and hasattr(val, "rule") and hasattr(val, "help"): for rule in val.rule: if "commands" in rule and args[0] in rule["commands"]: diff --git a/dave/modules/nice.py b/dave/modules/nice.py index ce4f967..3a40deb 100644 --- a/dave/modules/nice.py +++ a/dave/modules/nice.py @@ -6,5 +6,5 @@ @dave.module.help("Nice.", name="nice") @dave.module.match(r"^nice\.?$") @dave.module.priority(dave.module.Priority.LOW) -def donk(bot, args, sender, source): +def nice(bot, args, sender, source): bot.msg(source, "nice") diff --git a/dave/modules/pollen.py b/dave/modules/pollen.py index 6c20de2..12aff4f 100644 --- a/dave/modules/pollen.py +++ a/dave/modules/pollen.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- """Get the pollen count for a UK postcode.""" import dave.module from bs4 import BeautifulSoup -from mechanize import Browser +from requests import get from twisted.words.protocols.irc import assembleFormattedText, attributes as A -import socket import dave.config @@ -13,16 +12,13 @@ @dave.module.priority(dave.module.Priority.HIGHEST) def pollen(bot, args, sender, source): postcode = args[0].lower() - br = Browser() - br.set_handle_robots(False) text = None if not dave.config.redis.exists("pollen:{}".format(postcode)): - res = br.open("https://www.bbc.co.uk/weather/{}".format(postcode)) - data = res.get_data() + res = get("https://www.bbc.co.uk/weather/{}".format(postcode)) - soup = BeautifulSoup(data, "html.parser") + soup = BeautifulSoup(res.text, "html.parser") element = soup.find_all("div", class_="environmental-index pollen-index") if element: diff --git a/dave/modules/sed.py b/dave/modules/sed.py index 6de4092..70b636e 100644 --- a/dave/modules/sed.py +++ a/dave/modules/sed.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- """Pass any messages beginning with 'sed' to GNU sed.""" import dave.module import dave.config -from twisted.words.protocols.irc import assembleFormattedText, attributes as A import re @dave.module.help("Syntax: s/find/replace/flags", "sed") @@ -20,17 +19,18 @@ try: # bold replacements - replace = re.sub(args[3], "\x02{}\x0F".format(args[5]), - msg, count=0 if 'g' in flags else 1, flags=f) + toDisplay = re.sub(args[3], "\x02{}\x0F".format(args[5]), + msg.decode('utf-8'), count=0 if 'g' in flags else 1, flags=f) + toSave = re.sub(args[3], args[5], + msg.decode('utf-8'), count=0 if 'g' in flags else 1, flags=f) except Exception as e: bot.reply(source, sender, "There was a problem with your sed command: {}".format(str(e))) return - if replace.strip() != msg: - msg = replace.strip() - bot.msg(source, "<{}> {}".format(sender, msg)) - dave.config.redis.lset(key, i, msg) + if toDisplay.strip() != msg: + bot.msg(source, "<{}> {}".format(sender, toDisplay.strip())) + dave.config.redis.lset(key, i, toSave.strip()) return diff --git a/dave/modules/seen.py b/dave/modules/seen.py index f7002bb..ba50f4b 100644 --- a/dave/modules/seen.py +++ a/dave/modules/seen.py @@ -1,8 +1,7 @@ import pickle import dave.module import dave.config -from twisted.words.protocols.irc import assembleFormattedText, attributes as A from humanize import naturaltime from datetime import datetime diff --git a/dave/modules/title.py b/dave/modules/title.py index 0b5ac54..904ba90 100644 --- a/dave/modules/title.py +++ a/dave/modules/title.py @@ -26,11 +26,11 @@ if title is not None: title = re.sub(r"(\r?\n|\r| )+", " ", - title.string.encode("utf-8").strip()) + title.string.strip()) title = title[:140] + (title[140:] and '...') dave.config.redis.setex("site:{}".format(match), 300, title) else: - title = dave.config.redis.get("site:{}".format(match)) + title = dave.config.redis.get("site:{}".format(match)).decode('utf-8') if title is not None: titles.append(assembleFormattedText(A.bold[title])) diff --git a/dave/modules/urbandictionary.py b/dave/modules/urbandictionary.py index 362999a..9666aa1 100644 --- a/dave/modules/urbandictionary.py +++ a/dave/modules/urbandictionary.py @@ -5,7 +5,7 @@ import requests import pickle import re -from urllib import quote_plus +from urllib.parse import quote_plus from twisted.words.protocols.irc import assembleFormattedText, attributes as A @@ -19,7 +19,7 @@ key = "urban:{}:{}".format(query, result) if dave.config.redis.exists(key): - bot.reply(source, sender, dave.config.redis.get(key)) + bot.reply(source, sender, dave.config.redis.get(key).decode('utf-8')) return if not dave.config.redis.exists("urban_query:{}".format(query)): diff --git a/dave/modules/weather.py b/dave/modules/weather.py index 52868d8..7b0bb2e 100644 --- a/dave/modules/weather.py +++ a/dave/modules/weather.py @@ -5,7 +5,7 @@ import requests import dave.config import pickle -from urllib import quote_plus +from urllib.parse import quote_plus import arrow from dave.models import Location import socket diff --git a/dave/modules/wolfram.py b/dave/modules/wolfram.py index b219820..c9a0070 100644 --- a/dave/modules/wolfram.py +++ a/dave/modules/wolfram.py @@ -1,9 +1,8 @@ # -*- coding: utf-8 -*- """Query the Wolfram API when the user wants to find something out.""" import dave.module import dave.config import wolframalpha -import socket from twisted.words.protocols.irc import assembleFormattedText, attributes as A @@ -16,7 +15,7 @@ key = "wolfram:{}".format(query.lower()) if dave.config.redis.exists(key): - bot.reply(source, sender, dave.config.redis.get(key)) + bot.reply(source, sender, dave.config.redis.get(key).decode('utf-8')) dave.config.redis.setex(key, 60, dave.config.redis.get(key)) return @@ -24,17 +23,19 @@ client = wolframalpha.Client(dave.config.config["api_keys"]["wolfram"]) res = client.query(query) - if len(res.pods) > 0: + pods = list(res.pods) + + if len(pods) > 0: resultpod = next(res.results) - result = resultpod.text.encode('utf-8') + result = resultpod.text - if "image" in res.pods[0].text: + if "image" in pods[0].text: result = resultpod.img if len(result) > 500: result = result[:497] + "..." - res = assembleFormattedText(A.normal[A.bold[str(res.pods[0].text.encode('utf-8'))], + res = assembleFormattedText(A.normal[A.bold[pods[0].text], ": {}".format(result)]) - dave.config.redis.setex(key, 60, res.decode('utf-8')) - bot.reply(source, sender, res.decode('utf-8')) + dave.config.redis.setex(key, 60, res) + bot.reply(source, sender, res) -- rgit 0.1.3