From 8501dcde8503a569d147b8858823adc968de462b Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 9 Oct 2019 16:38:07 +0200 Subject: [PATCH 01/16] Fixed a new problem with unicode and python lists. --- config.py.sample | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/config.py.sample b/config.py.sample index 57c3fc5..4b8cd4f 100644 --- a/config.py.sample +++ b/config.py.sample @@ -5,21 +5,20 @@ class Config(object): lastpubmsg = 0 def __init__(self): - self.HOST = "irc.rizon.net" + self.HOST = 'irc.rizon.net' self.PORT = 9999 self.PASSWORD = None self.SSL = True - self.NICK = "rss2irc" - self.NICKPASS = "" - self.CHANNEL = "#tests" - self.admin_nicks= [''] + self.NICK = 'rss2irc' + self.NICKPASS = '' + self.CHANNEL = '#tests' - """ + ''' 00 - white 01 - black 02 - blue (navy) 03 - green 04 - red 05 - brown 06 - purple 07 - orange 08 - yellow 09 - light green 10 - teal 11 - cyan 12 - light blue 13 - pink 14 - grey 15 - light grey - """ + ''' self.use_colors = True self.num_col = 'red' # Empty for dafault color @@ -33,5 +32,6 @@ class Config(object): self.postdelay = 180 # Post delay during conversation in seconds. 0 for off. self.feedorderdesc = False self.update_before_connecting = True # Update all feeds before connecting to the IRC server - self.filterkeywords = {} # Lower-case keywords list to filter in title news. Use - # {"one","two","three"} to activate or {} for deactivate. + self.filterkeywords = () # Lower-case keywords list to filter in title news. Use + # ('one','two','three') to activate or () for deactivate. + From 278c485262cb10759e8ed9e27f4a70d05038a8cb Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 9 Oct 2019 16:41:42 +0200 Subject: [PATCH 02/16] Updated "necessary_options" list. --- bot.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bot.py b/bot.py index 472d120..5c61850 100644 --- a/bot.py +++ b/bot.py @@ -241,9 +241,9 @@ def __init__(self): self.__connected = False def __check_config(self): - necessary_options = ["HOST", "PORT", "PASSWORD", "SSL", "CHANNEL", "NICK", "admin_nicks", "use_colors", - "num_col", "date", "feedname", "shorturls", "dateformat", "feedlimit", "update_before_connecting", - "url", "feedorderdesc"] + necessary_options = ["HOST", "PORT", "PASSWORD", "SSL", "CHANNEL", + "use_colors", "num_col", "feedname", "newstitle", "url", "date", "shorturls", "dateformat", "feedlimit", + "postdelay", "feedorderdesc", "update_before_connecting", "filterkeywords"] missing_options = [] for key in necessary_options: if not hasattr(self.__config, key): From 754165d4e399499fa04efd91e352da42037a2491 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 27 Jan 2021 18:03:58 +0100 Subject: [PATCH 03/16] Update requirements.txt Removed "TinyUrl" because it is no longer available and replaced by "requests" to use the v.gd shortener. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index df2be02..2836f6a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,4 +15,4 @@ pytz==2016.4 six==1.10.0 git+https://github.com/palantir/sqlite3worker#egg=sqlite3worker tempora==1.4 -TinyUrl==0.1.0 +requests==2.25.1 From c6eb812b354616e26a217a749e41ac0422d671ee Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 27 Jan 2021 18:23:18 +0100 Subject: [PATCH 04/16] Update bot.py Added "shorten" function to use the "v.gd" shortener instead of the missing "TinyUrl". --- bot.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bot.py b/bot.py index 5c61850..3843053 100644 --- a/bot.py +++ b/bot.py @@ -6,13 +6,13 @@ import irc.bot import irc.client import irc.connection -import tinyurl import time import re import sys import feedparser import datetime import dateutil.parser +import requests from colour import Colours from db import FeedDB from config import Config @@ -187,7 +187,7 @@ def post_news(self, feed_name, title, url, date): """Try shortening url""" if self.__config.shorturls: try: - post_url = tinyurl.create_one(url) + post_url = self.shorten(url) if ("error" in post_url.lower()): post_url = url except Exception as e: @@ -204,6 +204,15 @@ def post_news(self, feed_name, title, url, date): print datetime.datetime.now(), e sys.stdout.flush() + def shorten(self, url): + try: # Trying to shorten URL + sresponse = requests.get('https://v.gd/create.php?format=json&url=' + url) + surl = sresponse.json()['shorturl'] + except Exception as err: + print('A shortening error occurred.') + surl = url + return surl + def __get_colored_text(self, color, text): if not self.__config.use_colors: return text From d8db9942af1c5a04d08d137a12de32dc076cad60 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 27 Jan 2021 22:18:59 +0100 Subject: [PATCH 05/16] Update bot.py Fixed some text strings. --- bot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bot.py b/bot.py index 3843053..3f5b120 100644 --- a/bot.py +++ b/bot.py @@ -67,7 +67,7 @@ def on_join(self, connection, event): self.__first_start = True def welcome_msg(self): - msg = u"Hi, I'm the channel's " + self.get_bolded_text(self.__get_colored_text(self.color_feedname,"RSS")) + u" news publishing bot v2.0. Send " + self.__get_colored_text(self.color_num,"!help") + u" to receive a list of commands in private message (PM). If you find me annoying, you can to use " + self.__get_colored_text(self.color_num,"/IGNORE " + self.connection.get_nickname()) + u" to stop reading me." + msg = u"Hi, I'm the channel " + self.get_bolded_text(self.__get_colored_text(self.color_feedname,"RSS")) + u" news publishing bot v2.1. Send " + self.__get_colored_text(self.color_num,"!help") + u" to receive a command list in private message (PM). If you find me annoying, you can to use " + self.__get_colored_text(self.color_num,"/IGNORE " + self.connection.get_nickname()) + u" to stop reading me." time.sleep(1) return msg From d082e5859372aaf3174881190f3f1447cf046541 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Thu, 28 Jan 2021 08:01:52 +0100 Subject: [PATCH 06/16] Update README.md Added background execution method and sending to log. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 15cea2b..c34bc58 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,12 @@ python2 feedupdater.py ``` To start the bot, run: - ``` python2 main.py +``` + or +``` +./main.py 2>&1 > newsbot.log & ``` If you want to run this as a systemd service, you can use the `rss2irc.service` file after adjusting the paths in there. From a02d09289901173ac383f90766ff34fce9c11ae8 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Fri, 29 Jan 2021 17:48:58 +0100 Subject: [PATCH 07/16] Update README.md Background mode command corrected. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c34bc58..9413d93 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ python2 main.py ``` or ``` -./main.py 2>&1 > newsbot.log & +python2 main.py 2>&1 > newsbot.log & ``` If you want to run this as a systemd service, you can use the `rss2irc.service` file after adjusting the paths in there. From b3dc5da657ab3ae142cad8b6c7d803f0d856501e Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 3 Feb 2021 19:28:10 +0100 Subject: [PATCH 08/16] Update requirements.txt Minimized list. --- requirements.txt | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2836f6a..bb2404c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,5 @@ -backports.functools-lru-cache==1.2.1 -feedparser==5.2.1 -inflect==0.2.5 -irc==14.2 -jaraco.classes==1.3 -jaraco.collections==1.3.2 -jaraco.functools==1.11 -jaraco.itertools==1.7.1 -jaraco.logging==1.3.1 -jaraco.stream==1.1 -jaraco.text==1.6.3 -more-itertools==2.2 -python-dateutil==2.5.3 -pytz==2016.4 -six==1.10.0 git+https://github.com/palantir/sqlite3worker#egg=sqlite3worker -tempora==1.4 +feedparser==5.2.1 requests==2.25.1 +irc==14.2 +python_dateutil==2.8.1 From a3c7175a6f3b094fff8b8cad3d31048897af56c9 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:08:38 +0100 Subject: [PATCH 09/16] Updated for Python3 setup --- README.md | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 9413d93..fecb6cd 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This is a simple bot which fetches RSS feeds and posts them to an IRC channel. # Requirements -- python2 -- pip -- virtualenv (`pip2 install virtualenv`) +- python3 +- pip3 +- virtualenv (`pip3 install virtualenv`) # Features @@ -15,9 +15,10 @@ This is a simple bot which fetches RSS feeds and posts them to an IRC channel. - Fetches every feed in a separate thread - Posts new news items to an IRC channel - Sends information via private messages +- SSL connection support - Full utf-8 support - Nick login support -- Post delayed during conversation +- Delayed post during conversation - Keywords in news title filtering support - Customizable post colors - Automatic join to channel on kick @@ -26,12 +27,12 @@ This is a simple bot which fetches RSS feeds and posts them to an IRC channel. ``` Help: - Send all commands as a private message to Feed + Send all commands as a private message - !help Prints this help - !list Prints all feeds - !stats Prints some statistics - - !last Prints the last 25 entries - - !lastfeed Prints the last 25 entries from a specific feed + - !last Prints the last 10 entries + - !lastfeed Prints the last 10 entries from a specific feed ``` # Setup @@ -39,24 +40,16 @@ Help: Clone this repository and change into the directory. Create a new virtualenv and activate it: ``` -virtualenv venv -. venv/bin/activate +virtualenv -p python3 venv +source venv/bin/activate ``` Proceed with the installation of all dependencies: ``` -pip install -r requirements.txt +pip3 install -r requirements.txt ``` -If you get an error that `sqlite3worker` couldn't be installed, use - -``` -pip install git+https://github.com/palantir/sqlite3worker#egg=sqlite3worker -``` - -and retry the installation. - Copy the sample files: ``` @@ -69,16 +62,16 @@ Edit `config.py` to fit your needs and IRC settings. All feeds from `feeds.sql` You might want to update all feeds before connecting to the IRC server to prevent spamming the channel (and optionally a ban from your IRC server). Either set `update_before_connecting = True` in the `config.py` or run the update script before starting the bot: ``` -python2 feedupdater.py +python3 feedupdater.py ``` To start the bot, run: ``` -python2 main.py +python3 main.py ``` - or + or in background: ``` -python2 main.py 2>&1 > newsbot.log & +python3 main.py 2>&1 > newsbot.log & ``` If you want to run this as a systemd service, you can use the `rss2irc.service` file after adjusting the paths in there. From 456bd901a9948a426a8af3fb7468a0ae71f021e2 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:10:29 +0100 Subject: [PATCH 10/16] Traslated to Python3 --- bot.py | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/bot.py b/bot.py index 3f5b120..7dbe879 100644 --- a/bot.py +++ b/bot.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- - import ssl import threading import irc.bot @@ -37,25 +34,25 @@ def __init__(self, config, db, on_connect_cb): if self.__config.SSL: ssl_factory = irc.connection.Factory(wrapper=ssl.wrap_socket) - print datetime.datetime.now(), u"Starting SSL connection." + print(datetime.datetime.now(), "Starting SSL connection.") sys.stdout.flush() super(IRCBot, self).__init__(self.__servers, self.__config.NICK, self.__config.NICK, connect_factory=ssl_factory) else: - print datetime.datetime.now(), u"Starting connection." + print(datetime.datetime.now(), "Starting connection.") sys.stdout.flush() super(IRCBot, self).__init__(self.__servers, self.__config.NICK, self.__config.NICK) def on_welcome(self, connection, event): """Login""" if self.__config.NICKPASS: - print datetime.datetime.now(), u"Starting authentication." + print(datetime.datetime.now(), "Starting authentication.") sys.stdout.flush() self.send_msg("NickServ", "IDENTIFY {}".format(self.__config.NICKPASS)) """Join the correct channel upon connecting""" if irc.client.is_channel(self.__config.CHANNEL): - print datetime.datetime.now(), u"Joining to channel." + print(datetime.datetime.now(), "Joining to channel.") sys.stdout.flush() connection.join(self.__config.CHANNEL) @@ -67,7 +64,7 @@ def on_join(self, connection, event): self.__first_start = True def welcome_msg(self): - msg = u"Hi, I'm the channel " + self.get_bolded_text(self.__get_colored_text(self.color_feedname,"RSS")) + u" news publishing bot v2.1. Send " + self.__get_colored_text(self.color_num,"!help") + u" to receive a command list in private message (PM). If you find me annoying, you can to use " + self.__get_colored_text(self.color_num,"/IGNORE " + self.connection.get_nickname()) + u" to stop reading me." + msg = "Hi, I'm the channel " + self.get_bolded_text(self.__get_colored_text(self.color_feedname,"RSS")) + " news publishing bot v2.1. Send " + self.__get_colored_text(self.color_num,"!help") + " to receive a command list in private message (PM). If you find me annoying, you can to use " + self.__get_colored_text(self.color_num,"/IGNORE " + self.connection.get_nickname()) + " to stop reading me." time.sleep(1) return msg @@ -77,7 +74,7 @@ def on_kick(self, connection, event): botnick = self.connection.get_nickname().lower() if irc.client.is_channel(self.__config.CHANNEL) and banned_nick == botnick: time.sleep(31) - print datetime.datetime.now(), u"Joining to channel again." + print(datetime.datetime.now(), "Joining to channel again.") sys.stdout.flush() connection.join(self.__config.CHANNEL) @@ -92,13 +89,13 @@ def __handle_msg(self, msg): elif msg == "!list": answer = "" for entry in self.__db.get_feeds(): - answer += "#" + self.__get_colored_text(self.color_num,str(entry[0]) + " - ") + self.get_bolded_text(self.__get_colored_text(self.color_feedname,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ",") + u" updated every " + self.__get_colored_text(self.color_num,str(entry[3])) + u" minutes." + "\n" + answer += "#" + self.__get_colored_text(self.color_num,str(entry[0]) + " - ") + self.get_bolded_text(self.__get_colored_text(self.color_feedname,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ",") + " updated every " + self.__get_colored_text(self.color_num,str(entry[3])) + " minutes." + "\n" # Print some simple stats (Feed / News count) elif msg == "!stats": feeds_count = self.__db.get_feeds_count() news_count = self.__db.get_news_count() - answer = u"Feeds: " + self.get_bolded_text(self.__get_colored_text(self.color_num,str(feeds_count))) + u", News: " + self.get_bolded_text(self.__get_colored_text(self.color_num,str(news_count))) + answer = "Feeds: " + self.get_bolded_text(self.__get_colored_text(self.color_num,str(feeds_count))) + ", News: " + self.get_bolded_text(self.__get_colored_text(self.color_num,str(news_count))) # Print last config.feedlimit news. elif msg == "!last": @@ -116,7 +113,7 @@ def __handle_msg(self, msg): try: feedid = int(msg.replace("!lastfeed","").strip()) except: - return self.__get_colored_text('1',u"Wrong command. ") + msg + u". Send !lastfeed " + return self.__get_colored_text('1',"Wrong command. ") + msg + ". Send !lastfeed " items = self.__db.get_news_from_feed(feedid, self.__config.feedlimit) if not self.__config.feedorderdesc: items = items[::-1] @@ -125,11 +122,11 @@ def __handle_msg(self, msg): # Else tell the user how to use the bot else: - answer = u"Send !help to see the available commands." + answer = "Send !help to see the available commands." except Exception as e: - print datetime.datetime.now(), e + print(datetime.datetime.now(), e) sys.stdout.flush() - answer = u"Something was wrong." + answer = "Something was wrong." return answer def on_privmsg(self, connection, event): @@ -139,7 +136,7 @@ def on_privmsg(self, connection, event): # Get the message and return an answer msg = event.arguments[0].lower().strip() - print datetime.datetime.now(), msg, "command from", event.source.nick + print(datetime.datetime.now(), msg, "command from", event.source.nick) sys.stdout.flush() answer = self.__handle_msg(msg) self.send_msg(event.source.nick, answer) @@ -174,14 +171,14 @@ def send_msg(self, target, msg): self.connection.privmsg(target, sub_line) time.sleep(1) # Don't flood the target except Exception as e: - print datetime.datetime.now(), e + print(datetime.datetime.now(), e) sys.stdout.flush() def post_news(self, feed_name, title, url, date): """Cancel post if filter keyword is in title""" for keyword in self.filterkeywords: if keyword in title.lower(): - print datetime.datetime.now(), u"Found", keyword, "keyword in title. Aborting post." + print(datetime.datetime.now(), "Found", keyword, "keyword in title. Aborting post.") sys.stdout.flush() return """Try shortening url""" @@ -192,7 +189,7 @@ def post_news(self, feed_name, title, url, date): post_url = url except Exception as e: post_url = url - print datetime.datetime.now(), e + print(datetime.datetime.now(), e) sys.stdout.flush() else: post_url = url @@ -201,7 +198,7 @@ def post_news(self, feed_name, title, url, date): msg = self.__get_colored_text(self.color_feedname,feed_name + ": ") + self.get_bolded_text(self.__get_colored_text(self.color_newstitle,title)) + " > " + self.__get_colored_text(self.color_url,post_url + ", ") + self.__get_colored_text(self.color_date,str(date)) self.send_msg(self.__config.CHANNEL, msg) except Exception as e: - print datetime.datetime.now(), e + print(datetime.datetime.now(), e) sys.stdout.flush() def shorten(self, url): @@ -225,11 +222,11 @@ def get_bolded_text(self, string): def __help_msg(self): """Returns the help/usage message""" - return u"""\ + return """\ Help: - - /IGNORE """ + self.connection.get_nickname() + u""" - Lets you stop reading the bot. + - /IGNORE """ + self.connection.get_nickname() + """ - Lets you stop reading the bot. - You can send these commands in private message (PM) to """ + self.connection.get_nickname() + u""": + You can send these commands in private message (PM) to """ + self.connection.get_nickname() + """: - !help - Show this help message. - !stats - Show some statistics. - !list - Show all feeds. @@ -264,24 +261,24 @@ def get_missing_options(self): def start(self): """Starts the IRC bot""" - print datetime.datetime.now(), u"Starting bot." + print(datetime.datetime.now(), "Starting bot.") sys.stdout.flush() threading.Thread(target=self.__irc.start).start() def initial_feed_update(self): def print_feed_update(feed_title, news_title, news_url, news_date): - print datetime.datetime.now(), u"[+]: {}||{}||{}||{}".format(feed_title, news_title, news_url, news_date) + print(datetime.datetime.now(), "[+]: {}||{}||{}||{}".format(feed_title, news_title, news_url, news_date)) sys.stdout.flush() if self.__config.update_before_connecting: - print datetime.datetime.now(), u"Starting offline update." + print(datetime.datetime.now(), "Starting offline update.") sys.stdout.flush() self.__feedupdater.update_feeds(print_feed_update, False) def on_started(self): """Gets executed after the IRC thread has successfully established a connection.""" if not self.__connected: - print datetime.datetime.now(), u"Starting feeds periodic update..." + print(datetime.datetime.now(), "Starting feeds periodic update...") sys.stdout.flush() self.__feedupdater.update_feeds(self.__irc.post_news, True) self.__connected = True From d9fc5b9f62682968c6b9caf6c73a10bbc27e21a9 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:12:02 +0100 Subject: [PATCH 11/16] Traslated to Python3 --- colour.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/colour.py b/colour.py index 931414e..b063312 100644 --- a/colour.py +++ b/colour.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- - class Colours: def __init__(self, col, string): self.colour = col From 59ec3eb2d5faaf45e6d6479ff234569dda85a006 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:13:54 +0100 Subject: [PATCH 12/16] Translated to Python3 --- db.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/db.py b/db.py index b9c9575..871c8b5 100644 --- a/db.py +++ b/db.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- - from sqlite3worker import Sqlite3Worker from config import Config import os From e3a586ae6b751ad4014ed784e32e6e4d101fb420 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:15:11 +0100 Subject: [PATCH 13/16] Translated to Python3 --- feedupdater.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/feedupdater.py b/feedupdater.py index fe01190..79f32ad 100644 --- a/feedupdater.py +++ b/feedupdater.py @@ -1,5 +1,4 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- +#!/usr/bin/env python3 import feedparser import datetime @@ -68,15 +67,15 @@ def __fetch_feed(self, feed_info, callback, forever): newsdate = newsdate.strftime(self.__config.dateformat) except Exception as e: - newsdate = u"No date" + newsdate = "No date" # Update the database. If it's a new issue, post it to the channel is_new = self.__db.insert_news(feed_info['id'], newstitle, newsitem.link, newsdate) if is_new and callback is not None: callback(feed_info['title'], newstitle, newsurl, newsdate) except Exception as e: - print datetime.datetime.now(), e - print datetime.datetime.now(), u"Feed not updated: " + feed_info['title'] + print(datetime.datetime.now(), e) + print(datetime.datetime.now(), "Feed not updated: " + feed_info['title']) sys.stdout.flush() @@ -88,7 +87,7 @@ def __fetch_feed(self, feed_info, callback, forever): if __name__ == "__main__": def print_line(feed_title, news_title, news_url, news_date): - print datetime.datetime.now(), u"[+]: {}||{}||{}||{}".format(feed_title, news_title, news_url, news_date) + print(datetime.datetime.now(), "[+]: {}||{}||{}||{}".format(feed_title, news_title, news_url, news_date)) sys.stdout.flush() def main(): @@ -96,12 +95,12 @@ def main(): db = FeedDB(config) updater = FeedUpdater(config, db) - print datetime.datetime.now(), u"Starting offline update." + print(datetime.datetime.now(), "Starting offline update.") sys.stdout.flush() updater.update_feeds(print_line, False) def signal_handler(signal, frame): - print datetime.datetime.now(), u"Received SIGINT signal, finishing bot." + print(datetime.datetime.now(), "Received SIGINT signal, finishing bot.") sys.stdout.flush() os._exit(0) From 1781a3f7139794fd5d4d69d558bce827f0bee80d Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:16:25 +0100 Subject: [PATCH 14/16] Translated to Python3 --- main.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/main.py b/main.py index f720e68..71ffeea 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,4 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- +#!/usr/bin/env python3 from bot import Bot from feedupdater import FeedUpdater @@ -8,14 +7,9 @@ import signal import datetime import sys -import codecs -import locale - -sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout) -sys.stderr = codecs.getwriter(locale.getpreferredencoding())(sys.stderr) def signal_handler(signal, frame): - print datetime.datetime.now() , u"Received SIGINT signal, finishing bot." + print(datetime.datetime.now() , "Received SIGINT signal, finishing bot.") sys.stdout.flush() os._exit(0) @@ -25,7 +19,7 @@ def signal_handler(signal, frame): missing_config_keys = bot.get_missing_options() if not len(missing_config_keys) == 0: for key in missing_config_keys: - print datetime.datetime.now(), u"The '{}' option isn't set up! Check configuration.".format(key) + print(datetime.datetime.now(), "The '{}' option isn't set up! Check configuration.".format(key)) sys.stdout.flush() os._exit(1) From 6de1c5a3e6084752d46585b4da2e865c8d558fbe Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:18:09 +0100 Subject: [PATCH 15/16] Updated for Python3 --- requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index bb2404c..17a5bfe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -git+https://github.com/palantir/sqlite3worker#egg=sqlite3worker -feedparser==5.2.1 -requests==2.25.1 -irc==14.2 +feedparser==6.0.2 +irc==19.0.1 python_dateutil==2.8.1 +requests==2.25.1 +sqlite3worker==1.1.7 From a8b7634cbda80e055fa2e10ec5fd1527164c0dd0 Mon Sep 17 00:00:00 2001 From: Wibol <19147332+Wibol@users.noreply.github.com> Date: Fri, 12 Feb 2021 13:21:29 +0100 Subject: [PATCH 16/16] Private messages and anti-flood. Improved private message formatting and optimized anti-flood measures. --- bot.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bot.py b/bot.py index 7dbe879..86956a3 100644 --- a/bot.py +++ b/bot.py @@ -89,7 +89,7 @@ def __handle_msg(self, msg): elif msg == "!list": answer = "" for entry in self.__db.get_feeds(): - answer += "#" + self.__get_colored_text(self.color_num,str(entry[0]) + " - ") + self.get_bolded_text(self.__get_colored_text(self.color_feedname,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ",") + " updated every " + self.__get_colored_text(self.color_num,str(entry[3])) + " minutes." + "\n" + answer += "# " + self.__get_colored_text(self.color_num,str(entry[0]) + "- ") + self.get_bolded_text(self.__get_colored_text(self.color_feedname,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ",") + " updated every " + self.__get_colored_text(self.color_num,str(entry[3])) + " minutes." + "\n" # Print some simple stats (Feed / News count) elif msg == "!stats": @@ -105,7 +105,7 @@ def __handle_msg(self, msg): items = items[::-1] for entry in items: - answer += "#" + self.__get_colored_text(self.color_num,str(entry[0]) + " - ") + self.get_bolded_text(self.__get_colored_text(self.color_newstitle,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ", ") + self.__get_colored_text(self.color_date,str(entry[3])) + "\n" + answer += "# " + self.__get_colored_text(self.color_num,str(entry[0]) + "- ") + self.get_bolded_text(self.__get_colored_text(self.color_newstitle,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ", ") + self.__get_colored_text(self.color_date,str(entry[3])) + "\n" # Print last config.feedlimit news for a specific feed elif msg.startswith("!lastfeed"): @@ -118,7 +118,7 @@ def __handle_msg(self, msg): if not self.__config.feedorderdesc: items = items[::-1] for entry in items: - answer += "#" + self.__get_colored_text(self.color_num,str(entry[0]) + " - ") + self.get_bolded_text(self.__get_colored_text(self.color_newstitle,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ", ") + self.__get_colored_text(self.color_date,str(entry[3])) + "\n" + answer += "# " + self.__get_colored_text(self.color_num,str(entry[0]) + "- ") + self.get_bolded_text(self.__get_colored_text(self.color_newstitle,entry[1] + " > ")) + self.__get_colored_text(self.color_url,entry[2] + ", ") + self.__get_colored_text(self.color_date,str(entry[3])) + "\n" # Else tell the user how to use the bot else: @@ -168,8 +168,8 @@ def send_msg(self, target, msg): for line in msg.split("\n"): # Split lines that are longer than 510 characters into multiple messages. for sub_line in re.findall('.{1,510}', line): + time.sleep(2) # Don't flood the target self.connection.privmsg(target, sub_line) - time.sleep(1) # Don't flood the target except Exception as e: print(datetime.datetime.now(), e) sys.stdout.flush()