Compare commits

..

20 Commits

Author SHA1 Message Date
b3364d99b0 bump version 2023-07-16 23:04:20 +00:00
fec0ee4b10 add missing dep on requests 2023-07-16 23:03:52 +00:00
cc274a5d96 remove unnecessary imports 2023-07-16 23:03:40 +00:00
45809ff5ec rebrand CTCP VERSION response 2023-07-16 22:49:51 +00:00
3fa1bb4c92 remove unnecessary flask dependency 2023-07-16 22:48:24 +00:00
125528c567 remove garbage collection entirely 2023-07-16 22:47:04 +00:00
a44082180c change nick to 'huan' 2023-07-16 22:42:00 +00:00
c018534c0e remove urlinfo entirely 2023-07-16 22:39:26 +00:00
bb67f98d4b add requirements.txt 2023-07-16 22:38:13 +00:00
b06a606fd7 remove tweepy and twitter related stuff 2023-07-16 22:37:59 +00:00
5ed96b0ddf remove tweepy submodule 2023-07-16 22:31:40 +00:00
c875a4a17d disable logging to file 2023-07-16 22:28:37 +00:00
2cb3eec4aa change admin nick to 'jkhsjdhjs' 2023-07-16 22:27:19 +00:00
818110e485 set MODE -x on startup 2023-07-16 22:26:44 +00:00
428814b318 disable fefe and garbage collection threads 2023-07-16 22:26:17 +00:00
a291010ae1 fix a sleep statement in the gc thread 2023-07-16 22:25:35 +00:00
e6f8dbd1e8 disable urlinfo as it can make the bot run OOM 2023-07-16 22:24:49 +00:00
7009169145 fix joining channels on startup 2023-07-16 22:24:05 +00:00
bd5621f9bd fix username escape in whois regex 2023-07-16 22:21:42 +00:00
ad96b14445 replace deprecated ssl.wrap() 2023-07-16 22:19:06 +00:00
5 changed files with 28 additions and 121 deletions

137
bert.py
View File

@ -1,45 +1,33 @@
#!/usr/bin/python3 -u #!/usr/bin/python3 -u
import gc
import socket import socket
import ssl import ssl
import sys import sys
import os import os
from time import sleep from time import sleep
import launch import launch
import tweepy
import threading import threading
import re import re
import html
import json import json
import requests import requests
from datetime import datetime from datetime import datetime, timedelta
from datetime import timedelta
import konfuzius import konfuzius
import urlinfo
import fml import fml
import string import string
import random import random
from flask import Flask, request
from nslookup import nslookup from nslookup import nslookup
import rss import rss
version = "v0.8" version = "v0.9"
# IRC settings # IRC settings
host = "" host = ""
port = port =
nick = "bert" nick = "huan"
password = "" password = ""
chan = "" chan = ""
fefe_chans = [""] fefe_chans = [""]
# Twitter settings
consumer_key = ""
consumer_secret = ""
access_token = ""
access_secret = ""
# fml endpoint # fml endpoint
fml_url = "http://www.fmylife.com/random" fml_url = "http://www.fmylife.com/random"
@ -50,9 +38,9 @@ y = "\x038"
r = "\x034" r = "\x034"
g = "\x033" g = "\x033"
context = ssl.create_default_context()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
irc = ssl.wrap_socket(s) irc = context.wrap_socket(sock, server_hostname=host)
# Currency API # Currency API
@ -133,6 +121,12 @@ def mode(nick):
except Exception as err: except Exception as err:
print("Failed! "+err) print("Failed! "+err)
print("Setting mode -x")
try:
sendRaw("MODE "+nick+" -x\n")
except Exception as err:
print("Failed! "+err)
def part(chan): def part(chan):
print("Leaving channel "+chan) print("Leaving channel "+chan)
@ -195,19 +189,13 @@ def yon():
return answer return answer
def url_title(url):
title = urlinfo.get_title(url).encode("UTF-8").decode("UTF-8")
return title
def is_registered(username): def is_registered(username):
try: try:
sendRaw("WHOIS "+str(username)+"\n") sendRaw("WHOIS "+str(username)+"\n")
user_info = getMessage() user_info = getMessage()
regex = r"330 "+str(nick)+" "+str(username)+" [a-zA-Z0-9]+ :is logged in as" regex = r"330 "+str(re.escape(nick))+" "+str(re.escape(username))+" \S+ :is logged in as"
matches = re.finditer(regex, user_info, re.MULTILINE) matches = re.finditer(regex, user_info, re.MULTILINE)
for match in matches: for match in matches:
print(match.group(0))
acc_name = match.group(0).split()[3] acc_name = match.group(0).split()[3]
return acc_name return acc_name
except Exception as err: except Exception as err:
@ -271,7 +259,7 @@ def ping(msg):
sendRaw("PONG :"+msg+"\n") sendRaw("PONG :"+msg+"\n")
def start(host, port, nick, password, chan): def start(host, port, nick, password, chans):
try: try:
connect(host, port) connect(host, port)
sleep(2) sleep(2)
@ -281,7 +269,7 @@ def start(host, port, nick, password, chan):
sleep(6) sleep(6)
auth(nick, password) auth(nick, password)
sleep(2) sleep(2)
for chan in fefe_chans: for chan in chans:
join(chan) join(chan)
sleep(2) sleep(2)
mode(nick) mode(nick)
@ -294,9 +282,6 @@ def command_loop():
while True: while True:
try: try:
data = getData() data = getData()
with open("bert.log", "a") as f:
f.write(data)
f.close()
ircmsg = data.strip("\n\r") ircmsg = data.strip("\n\r")
if ircmsg.find("PING :") != -1: if ircmsg.find("PING :") != -1:
pingstring = ircmsg.strip("PING :") pingstring = ircmsg.strip("PING :")
@ -314,7 +299,7 @@ def command_loop():
print("direct message received") print("direct message received")
if msg == "\x01VERSION\x01": if msg == "\x01VERSION\x01":
print("got ctcp version request") print("got ctcp version request")
notice(ircnick, "\x01VERSION BertBot "+version+"\x01") notice(ircnick, "\x01VERSION HuanBot (fork of BertBot) "+version+"\x01")
elif msg.startswith("\x01PING"): elif msg.startswith("\x01PING"):
print("got ctcp ping request") print("got ctcp ping request")
pingstring = msg.split()[1] pingstring = msg.split()[1]
@ -428,31 +413,6 @@ def command_loop():
except Exception as err: except Exception as err:
print("Error getting rep! - "+str(err)) print("Error getting rep! - "+str(err))
elif msg.startswith(".twitter"):
try:
twittername = msg.split()[1]
try:
lasttweet = api.user_timeline(screen_name=twittername, count=1, tweet_mode="extended")[0]
twit = lasttweet.full_text
user = lasttweet.user.name
text = html.unescape(re.sub(r'\n', ' ', twit))
say(channel, b+user+": "+c+text)
except Exception as err:
print("Could not get last tweet! "+err)
except:
say(channel, "You have to give me a username")
elif msg.startswith(".trump"):
try:
twittername = "realdonaldtrump"
lasttweet = api.user_timeline(screen_name=twittername, count=1, tweet_mode="extended")[0]
twit = lasttweet.full_text
user = lasttweet.user.name
text = html.unescape(re.sub(r'\n', ' ', twit))
say(channel, b+user+": "+c+text)
except Exception as err:
print("Could not get last tweet! "+err)
elif msg.startswith(".konfuzius"): elif msg.startswith(".konfuzius"):
try: try:
quote = konfuzius.random_quote() quote = konfuzius.random_quote()
@ -461,7 +421,7 @@ def command_loop():
say(channel, "Error :(") say(channel, "Error :(")
elif msg == ".quit": elif msg == ".quit":
if ircnick == "elmo": if ircnick == "jkhsjdhjs":
say(channel, "Flying to mars...") say(channel, "Flying to mars...")
print("got quit command. exiting...") print("got quit command. exiting...")
part(channel) part(channel)
@ -470,7 +430,7 @@ def command_loop():
say(channel, "You are not my master!") say(channel, "You are not my master!")
elif msg.startswith(".say"): elif msg.startswith(".say"):
if ircnick == "elmo": if ircnick == "jkhsjdhjs":
try: try:
sayit = msg.split(" ", 1)[1] sayit = msg.split(" ", 1)[1]
say(channel, str(sayit)) say(channel, str(sayit))
@ -481,7 +441,7 @@ def command_loop():
say(channel, "You are not my master!") say(channel, "You are not my master!")
elif msg.startswith(".debug"): elif msg.startswith(".debug"):
if ircnick == "elmo": if ircnick == "jkhsjdhjs":
try: try:
debugmsg = msg.split(" ", 1)[1] debugmsg = msg.split(" ", 1)[1]
raw(debugmsg) raw(debugmsg)
@ -491,30 +451,6 @@ def command_loop():
else: else:
say(channel, "You are not my master!") say(channel, "You are not my master!")
elif "twitter.com" in msg:
try:
p = re.compile('twitter\.com/[A-Za-z0-9]*/status/[0-9]*')
tweet_link = p.search(msg).group(0)
status_id = tweet_link.split("/")[3]
status = api.get_status(status_id, tweet_mode="extended")
user = status.user.name
text = status.full_text
print("found twitter link\n"+user+" - "+text)
say(channel, b+user+": "+c+text)
except Exception as err:
print("twitter link invalid "+str(err))
elif urlinfo.is_url(msg) != None:
try:
url = urlinfo.is_url(msg)
ignore = ["pr0gramm", "w0bm", "f0ck", "twitter", "youtube", "youtu.be"]
if any(ign in url for ign in ignore):
pass
else:
title = urlinfo.get_title(url)
print("Found URL and got title "+str(title))
say(channel, b+"Title: "+c+title)
except Exception as err:
print("Error getting URL title - "+str(err))
elif msg == ".fml": elif msg == ".fml":
try: try:
fml_string = fml.get_fml(fml_url) fml_string = fml.get_fml(fml_url)
@ -563,17 +499,6 @@ def fefe_check():
sleep(300) sleep(300)
def gc_cycle():
while True:
try:
# fire the garbage collector
gc.set_debug(gc.DEBUG_STATS)
gc.collect()
time.sleep(120)
except Exception as err:
print("Error in garbage collector! - "+str(err))
class command_thread(threading.Thread): class command_thread(threading.Thread):
def __init__(self, threadID): def __init__(self, threadID):
threading.Thread.__init__(self) threading.Thread.__init__(self)
@ -590,30 +515,14 @@ class fefe_thread(threading.Thread):
print("Starting fefe thread...") print("Starting fefe thread...")
fefe_check() fefe_check()
class gc_thread(threading.Thread):
def __init__(self, threadID):
threading.Thread.__init__(self)
self.threadID = threadID
def run(self):
print("Starting garbage collector thread...")
gc_cycle()
def main(): def main():
start(host, port, nick, password, chan) start(host, port, nick, password, set(join_chans + fefe_chans))
global api
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
thread_command = command_thread(1) thread_command = command_thread(1)
thread_fefe = fefe_thread(2) #thread_fefe = fefe_thread(2)
thread_gc = gc_thread(3)
thread_command.start() thread_command.start()
sleep(2) #sleep(2)
thread_fefe.start() #thread_fefe.start()
sleep(2)
thread_gc.start()
if __name__ == "__main__": if __name__ == "__main__":
gc.enable()
main() main()

View File

@ -2,7 +2,6 @@
import re import re
import random import random
import json
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup

5
requirements.txt Normal file
View File

@ -0,0 +1,5 @@
pytz
beautifulsoup4~=4.11
dnspython~=2.2
feedparser~=6.0
requests~=2.0

5
rss.py
View File

@ -3,16 +3,11 @@
import feedparser import feedparser
import time import time
from subprocess import check_output
import sys
def check(): def check():
feed_name = 'fefe' feed_name = 'fefe'
url = 'https://blog.fefe.de/rss.xml' url = 'https://blog.fefe.de/rss.xml'
#feed_name = sys.argv[1]
#url = sys.argv[2]
db = 'rss_feeds.db' db = 'rss_feeds.db'
limit = 12 * 3600 * 1000 limit = 12 * 3600 * 1000

1
tweepy

@ -1 +0,0 @@
Subproject commit 2efe385fc69385b57733f747ee62e6be12a1338b