Compare commits

..

11 Commits

Author SHA1 Message Date
97a315d2d1 fix giving rep to yourself via different nick with same account
thanks to findus for discovering this :D
2025-05-14 23:38:05 +00:00
b29cf737a7 exit if a TimeoutError occurs 2024-11-26 13:40:06 +00:00
51a37c4562 make 'is_registered' regex a raw string
to fix the following warning with python 3.12:
SyntaxWarning: invalid escape sequence '\S'
2024-06-02 15:13:59 +00:00
34a3f06d91 add socket timeout + exit if connection is lost
Fix #2
2024-01-31 01:01:35 +00:00
f92d59dd91 use socket.create_connection() for dualstack and socket timeout 2024-01-30 23:41:32 +00:00
e3cdce4f12 fix error handling during connect 2024-01-30 23:37:58 +00:00
f449305ccd fix str-concat during in except blocks 2024-01-30 22:58:08 +00:00
1b252ca2c7 Revert "fix accidental logging of understood messages"
This reverts commit e709a2ade1.
2024-01-30 22:24:52 +00:00
9aee38bc50 Revert "log unknown messages"
This reverts commit 359407187e.
2024-01-30 22:24:44 +00:00
e709a2ade1 fix accidental logging of understood messages 2024-01-30 22:19:25 +00:00
359407187e log unknown messages 2024-01-30 22:17:07 +00:00

92
bert.py
View File

@ -38,10 +38,8 @@ y = "\x038"
r = "\x034" r = "\x034"
g = "\x033" g = "\x033"
context = ssl.create_default_context() # global variable for the socket, see connect()
with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock: irc = None
irc = context.wrap_socket(sock, server_hostname=host)
# Currency API # Currency API
def get_exchange(): def get_exchange():
@ -71,11 +69,11 @@ def safeexit():
def connect(host, port): def connect(host, port):
global irc
print("Connecting to "+host+":"+str(port)) print("Connecting to "+host+":"+str(port))
try: context = ssl.create_default_context()
irc.connect((host, port)) with socket.create_connection((host, port), timeout=180) as sock:
except Exception as err: irc = context.wrap_socket(sock, server_hostname=host)
print("Connection failed! "+err)
def sendRaw(data): def sendRaw(data):
@ -84,26 +82,17 @@ def sendRaw(data):
def register(nick, host): def register(nick, host):
print("Registering User...") print("Registering User...")
try: sendRaw("USER "+nick+" "+host+" "+nick+" "+nick+"\n")
sendRaw("USER "+nick+" "+host+" "+nick+" "+nick+"\n")
except Exception as err:
print("Failed! "+err)
def name(nick): def name(nick):
print("Setting Nickname to "+nick) print("Setting Nickname to "+nick)
try: sendRaw("NICK "+nick+"\n")
sendRaw("NICK "+nick+"\n")
except Exception as err:
print("Failed! "+err)
def auth(nick, password): def auth(nick, password):
print("Authenticating...") print("Authenticating...")
try: sendRaw("PRIVMSG NickServ :IDENTIFY "+nick+" "+password+"\n")
sendRaw("PRIVMSG NickServ :IDENTIFY "+nick+" "+password+"\n")
except Exception as err:
print(err)
def join(chan): def join(chan):
@ -111,15 +100,12 @@ def join(chan):
try: try:
sendRaw("JOIN "+chan+"\n") sendRaw("JOIN "+chan+"\n")
except Exception as err: except Exception as err:
print("Failed! "+err) print("Failed! "+str(err))
def mode(nick): def mode(nick):
print("Setting modes +B-x") print("Setting modes +B-x")
try: sendRaw("MODE "+nick+" +B-x\n")
sendRaw("MODE "+nick+" +B-x\n")
except Exception as err:
print("Failed! "+err)
def part(chan): def part(chan):
@ -135,7 +121,7 @@ def say(chan, msg):
sendRaw("PRIVMSG "+chan+" :"+msg+"\n") sendRaw("PRIVMSG "+chan+" :"+msg+"\n")
print("OK") print("OK")
except Exception as err: except Exception as err:
print("Error: "+err) print("Error: "+str(err))
def raw(msg): def raw(msg):
@ -150,11 +136,18 @@ def me(chan, msg):
try: try:
sendRaw("PRIVMSG "+chan+" :\u0001ACTION "+msg+"\u0001\n") sendRaw("PRIVMSG "+chan+" :\u0001ACTION "+msg+"\u0001\n")
except Exception as err: except Exception as err:
print("Error: "+err) print("Error: "+str(err))
def getData(): def getData():
raw = irc.recv(4096) try:
raw = irc.recv(4096)
except TimeoutError:
print("Connection timed out!")
sys.exit(0)
if not raw:
print("Connection lost!")
sys.exit(0)
try: try:
data = raw.decode("UTF-8") data = raw.decode("UTF-8")
except: except:
@ -187,7 +180,7 @@ 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(re.escape(nick))+" "+str(re.escape(username))+" \S+ :is logged in as" regex = rf"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:
acc_name = match.group(0).split()[3] acc_name = match.group(0).split()[3]
@ -254,22 +247,19 @@ def ping(msg):
def start(host, port, nick, password, chans): def start(host, port, nick, password, chans):
try: connect(host, port)
connect(host, port) sleep(2)
sleep(2) register(nick, host)
register(nick, host) sleep(2)
sleep(2) name(nick)
name(nick) sleep(6)
sleep(6) auth(nick, password)
auth(nick, password) sleep(2)
sleep(2) mode(nick)
mode(nick) sleep(2)
sleep(2) for chan in chans:
for chan in chans: join(chan)
join(chan) sleep(2)
sleep(2)
except Exception as err:
print("FAIL: "+err)
def command_loop(): def command_loop():
@ -375,14 +365,14 @@ def command_loop():
except: except:
reason = "None" reason = "None"
print("with no reason") print("with no reason")
if user == ircnick:
say(channel, "You can't give rep to yourself. Selfish little prick!")
continue
try: try:
acc_name = is_registered(user) acc_name = is_registered(user)
give_acc = is_registered(ircnick) give_acc = is_registered(ircnick)
print("found account name for "+str(user)+": "+str(acc_name)) print("found account name for "+str(user)+": "+str(acc_name))
if acc_name != None and give_acc != None: if acc_name != None and give_acc != None:
if acc_name == give_acc:
say(channel, "You can't give rep to yourself. Selfish little prick!")
continue
give_rep(acc_name, user, give_acc, reason, channel) give_rep(acc_name, user, give_acc, reason, channel)
elif give_acc == None: elif give_acc == None:
say(channel, "You are not registered!") say(channel, "You are not registered!")
@ -509,7 +499,11 @@ class fefe_thread(threading.Thread):
fefe_check() fefe_check()
def main(): def main():
start(host, port, nick, password, set(join_chans + fefe_chans)) try:
start(host, port, nick, password, set(join_chans + fefe_chans))
except Exception as err:
print("FAIL: "+str(err))
sys.exit(1)
thread_command = command_thread(1) thread_command = command_thread(1)
#thread_fefe = fefe_thread(2) #thread_fefe = fefe_thread(2)
thread_command.start() thread_command.start()