Add initial idlerpg script. - annna - Annna the nice friendly bot. HTML git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/ DIR Log DIR Files DIR Refs DIR Tags DIR README --- DIR commit 033db9ba505d80e24fa0f8ae17ec0410dfa9ccd4 DIR parent a21e6cfb498b88e53eb1c8ca41b7749903f2e010 HTML Author: Annna Robert-Houdin <annna@bitreich.org> Date: Sun, 27 Aug 2023 13:06:33 +0200 Add initial idlerpg script. Diffstat: A modules/idlerpg/.idlerpg-channel-s… | 0 A modules/idlerpg/admins.txt | 1 + A modules/idlerpg/classes.txt | 34 +++++++++++++++++++++++++++++++ A modules/idlerpg/hackers.txt | 4 ++++ A modules/idlerpg/hardware.txt | 29 +++++++++++++++++++++++++++++ A modules/idlerpg/idlerpg-channel-se… | 257 +++++++++++++++++++++++++++++++ A modules/idlerpg/penalties.txt | 6 ++++++ A modules/idlerpg/shields.txt | 11 +++++++++++ A modules/idlerpg/weapons.txt | 15 +++++++++++++++ 9 files changed, 357 insertions(+), 0 deletions(-) --- DIR diff --git a/modules/idlerpg/.idlerpg-channel-service.py.swp b/modules/idlerpg/.idlerpg-channel-service.py.swp Binary files differ. DIR diff --git a/modules/idlerpg/admins.txt b/modules/idlerpg/admins.txt @@ -0,0 +1 @@ +__20h__ DIR diff --git a/modules/idlerpg/classes.txt b/modules/idlerpg/classes.txt @@ -0,0 +1,34 @@ +pirate +hacker +lurker +leecher +bitreich_member +c_programmer +c++_programmer +vala_programmer +lua_programmer +visual_basic_programmer +cobol_programmer +rust_programmer +php_programmer +javascript_programmer +backend_programmer +frontend_programmer +logo_programmer +excel_user +gopher_user +gopher_designer +web_user +web_designer +gentoo_developer +gentoo_user +linux_developer +linux_user +openbsd_developer +openbsd_user +netbsd_developer +netbsd_user +freebsd_developer +freebsd_user +windows_developer +windows_user DIR diff --git a/modules/idlerpg/hackers.txt b/modules/idlerpg/hackers.txt @@ -0,0 +1,4 @@ +__20h__ 475 logo_programmer pinebook snakeoil oscilloscope 0 +\subline 1375 web_user purism_librem_15 cloud_security oscilloscope 0 +kroovy 1375 netbsd_developer system76_oryx chroot ed(1) 0 +adc 775 windows_developer thinkpad_T_laptop laughable_programming_style mouse 0 DIR diff --git a/modules/idlerpg/hardware.txt b/modules/idlerpg/hardware.txt @@ -0,0 +1,29 @@ +system76_gazelle +system76_adder +system76_oryx +system76_serval +system76_bonobo +system76_galago +system76_lemur +system76_darter +system76_pangolin +thinkpad_T_laptop +thinkpad_R_laptop +thinkpad_X_laptop +thinkpad_A_laptop +thinkpad_S_laptop +thinkpad_G_laptop +thinkpad_Z_laptop +pinebook +pinebook_pro +pinephone +pinephone_pro +framework_13 +framework_16 +chromebook +android_phone +iphone +fairphone +purism_librem_13 +purism_librem_14 +purism_librem_15 DIR diff --git a/modules/idlerpg/idlerpg-channel-service.py b/modules/idlerpg/idlerpg-channel-service.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python +# coding=UTF-8 +# +# Copy me, if you can. +# by 20h +# + +import os +import sys +import getopt +import time +import random +import select +import pyinotify +import errno +import fcntl +import functools + +def readin_file(f): + lines = [] + try: + fd = open(f) + except: + sys.exit(1) + lines = [e.strip() for e in fd.readlines()] + fd.close() + return lines + +def readin_dictfile(f): + lines = [] + rdict = {} + try: + fd = open(f) + except: + sys.exit(1) + lines = [e.strip().split("\t") for e in fd.readlines()] + fd.close() + for line in lines: + rdict[line[0]] = line[1:] + return rdict + +def writeout_dictfile(f, d): + try: + fd = open(f, "w") + except: + sys.exit(1) + for key in d.keys(): + fd.write("%s\t%s\n" % (key, "\t".join([str(s) for s in d[key]]))) + fd.flush() + fd.close() + +def say(fpath, text): + fd = open(fpath, "w") + print("%s -> say: %s" % (fpath, text)) + fd.write("%s\n" % (text)) + fd.flush() + fd.close() + +def usage(app): + app = os.path.basename(app) + print("usage: %s [-h] ircuser basepath ircpath server channel" % (app), file=sys.stderr) + sys.exit(1) + +def main(args): + try: + opts, largs = getopt.getopt(args[1:], "h") + except getopt.GetoptError as err: + print(str(err)) + usage(args[0]) + + for o, a in opts: + if opts == "-h": + usage(args[0]) + else: + assert False, "unhandled option" + + if len(largs) < 5: + usage(args[0]) + return 1 + + ircuser = largs[0] + basepath = largs[1] + ircpath = largs[2] + server = largs[3] + channel = largs[4] + serverpath = "%s/%s" % (ircpath, server) + print("serverpath = %s" % (serverpath)) + chanpath = "%s/%s" % (serverpath, channel) + print("chanpath = %s" % (chanpath)) + + chaninpath = "%s/in" % (chanpath) + say(chaninpath, "/names %s\n" % (channel)) + + serveroutlines = readin_file("%s/out" % (serverpath)) + namesstring = " 353 %s = %s :" % (ircuser, channel) + users = [] + for line in serveroutlines[::-1]: + if namesstring in line: + for user in line.strip().split(namesstring)[1].split(" "): + if user.startswith("@"): + user = user[1:] + if user not in users: + users.append(user) + print("users = %s" % (users)) + if len(users) == 0: + return 1 + + penalties = readin_dictfile("%s/penalties.txt" % (basepath)) + print(penalties) + + classes = readin_dictfile("%s/classes.txt" % (basepath)) + print(classes) + hardware = readin_dictfile("%s/hardware.txt" % (basepath)) + print(hardware) + shields = readin_dictfile("%s/shields.txt" % (basepath)) + print(shields) + weapons = readin_dictfile("%s/weapons.txt" % (basepath)) + print(weapons) + + hackers = readin_dictfile("%s/hackers.txt" % (basepath)) + for hacker in hackers.keys(): + hackers[hacker][0] = int(hackers[hacker][0]) + hackers[hacker][5] = int(hackers[hacker][5]) + print(hackers) + admins = readin_dictfile("%s/admins.txt" % (basepath)) + print(admins) + + def random_hacker(): + hacker = [] + # Idletime + hacker.append(0) + # Class + hacker.append(random.choice(list(classes.keys()))) + # Hardware + hacker.append(random.choice(list(hardware.keys()))) + # Shield + hacker.append(random.choice(list(shields.keys()))) + # Weapon + hacker.append(random.choice(list(weapons.keys()))) + # Level + hacker.append(0) + return hacker + + def hacker_info(hackers, hacker): + hackerinfo = "The hacker %s of the class %s " % (hacker, hackers[hacker][1]) + hackerinfo += "is using his %s hardware " % (hackers[hacker][2]) + hackerinfo += "which is protected by %s. " % (hackers[hacker][3]) + hackerinfo += "%s's weapon is %s. " % (hacker, hackers[hacker][4]) + hackerinfo += "%s has idled for %d seconds and has reached level %d." % (hacker, hackers[hacker][0], hackers[hacker][5]) + say(chaninpath, hackerinfo) + + for user in users: + if user not in list(hackers.keys()) and user != ircuser: + hackers[user] = random_hacker() + print(hackers) + + inotifywm = pyinotify.WatchManager() + inotifywm.add_watch("%s/out" % (chanpath), pyinotify.IN_MODIFY) + inotifyfd = inotifywm.get_fd() + + def event_processor(notifier): + pass + notifier = pyinotify.Notifier(inotifywm, default_proc_fun=event_processor) + + chanoutfd = open("%s/out" % (chanpath), "r+") + chanoutfd.readlines() + while 1: + # Game ticks every 5 seconds. + try: + (rfds, wfds, sfds) = select.select([inotifyfd], [], [], 5) + except select.error as err: + if err.args[0] == errno.EINTR: + continue + break + if rfds == [] and wfds == [] and sfds == []: + print("game tick") + for hacker in hackers.keys(): + hackers[hacker][0] += 5 + # Level up every 5 days. + newlevel = int(hackers[hacker][0]/(86400*5)) + if newlevel > hackers[hacker][5]: + say(chaninpath, "%s levelled up to level %s!" % (hacker, newlevel)) + elif newlevel < hackers[hacker][5]: + say(chaninpath, "%s levelled down to level %s." % (hacker, newlevel)) + hackers[hacker][5] = newlevel + writeout_dictfile("%s/hackers.txt" % (basepath), hackers) + continue + + notifier.read_events() + notifier.process_events() + + lines = chanoutfd.readlines() + lines = [line.strip() for line in lines] + for line in lines: + if line == None or line == "": + continue + print("line = '%s'" % (line)) + + penalty = None + try: + (timestamp, user, remain) = line.split(" ", 2) + except ValueError: + continue + + if user.startswith("<") and user.endswith(">"): + hacker = user.split("<", 1)[1].split(">", 1)[0] + if hacker in admins.keys(): + print("is admin") + if remain.startswith("!"): + (cmd, *cmdargs) = remain.split(" ") + print("cmd = %s; cmdargs = %s" % (cmd, cmdargs)) + if cmd == "!info": + if len(cmdargs) > 0: + if cmdargs[0] in hackers: + hacker_info(hackers, cmdargs[0]) + else: + hacker_info(hackers, hacker) + else: + penalty = "text" + + elif user == "-!-": + (hacker, text) = remain.split(" ", 1) + if "has joined " in text: + penalty = "join" + hacker = hacker.split("(", 1)[0] + if hacker not in hackers: + hackers[hacker] = random_hacker() + hacker_info(hackers, hacker) + elif "has left " in text: + penalty = "part" + hacker = hacker.split("(", 1)[0] + elif "has quit " in text: + penalty = "quit" + hacker = hacker.split("(", 1)[0] + elif "changed nick to " in text: + penalty = "nick" + elif "kicked " in text: + penalty = "kick" + hacker = text.split(" ", 3)[2] + + if hacker == ircuser: + continue + if hacker not in hackers: + continue + + if penalty != None and penalty in penalties: + penaltytime = int(penalties[penalty][0]) + hackers[hacker][0] -= penaltytime + say(chaninpath, "%s, your idletime has been reduced by %d to %d due to the %s penalty." \ + % (hacker, penaltytime, hackers[hacker][0], penalty)) + writeout_dictfile("%s/hackers.txt" % (basepath), hackers) + + return 0 + +if __name__ == "__main__": + sys.exit(main(sys.argv)) + DIR diff --git a/modules/idlerpg/penalties.txt b/modules/idlerpg/penalties.txt @@ -0,0 +1,6 @@ +text 300 +quit 200 +part 400 +nick 250 +kick 350 +join 100 DIR diff --git a/modules/idlerpg/shields.txt b/modules/idlerpg/shields.txt @@ -0,0 +1,11 @@ +apparmor +unix_permissions +return_value_check +hardened_patches +chroot +pledge +snakeoil +laughable_programming_style +cloud_security +xml_firewall +air_gap DIR diff --git a/modules/idlerpg/weapons.txt b/modules/idlerpg/weapons.txt @@ -0,0 +1,15 @@ +vt100 +nmap(1) +web_browser +annna +chatgpt +keyboard +mouse +trackball +ethernet_cable +wifi_fryer +ir_diode +soldering_iron +oscilloscope +ed(1) +blockchain