Add more syncpoints to prevent idle cheating. - 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 17748414fa5683110077bdfb7c882322d307cde7 DIR parent 255e6d75c84b3ec7f476d72aee6c7856189352f8 HTML Author: Annna Robert-Houdin <annna@bitreich.org> Date: Sun, 17 Sep 2023 21:37:54 +0200 Add more syncpoints to prevent idle cheating. Diffstat: M modules/idlerpg/idlerpg-channel-se… | 75 ++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 16 deletions(-) --- DIR diff --git a/modules/idlerpg/idlerpg-channel-service.py b/modules/idlerpg/idlerpg-channel-service.py @@ -86,18 +86,22 @@ def main(args): chanpath = "%s/%s" % (serverpath, channel) 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) + + def get_channel_users(): + 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) + return users + + users = get_channel_users() if len(users) == 0: return 1 @@ -114,6 +118,12 @@ def main(args): for hacker in hackers.keys(): hackers[hacker][0] = int(hackers[hacker][0]) hackers[hacker][5] = int(hackers[hacker][5]) + # All are offline by default. + try: + hackers[hacker][6] = 0 + except IndexError: + hackers[hacker].append(0) + admins = readin_dictfile("%s/admins.txt" % (basepath)) def random_hacker(): @@ -130,6 +140,8 @@ def main(args): hacker.append(random.choice(list(weapons.keys()))) # Level hacker.append(0) + # Online + hacker.append(1) return hacker def calamity(hackers, hacker): @@ -245,10 +257,19 @@ def main(args): 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: - # Build a hacker for newly appeared irc user - if user not in list(hackers.keys()) and user != ircuser: - hackers[user] = random_hacker() + def update_hackers_from_users(hackers, users): + for user in users: + # Build a hacker for newly appeared irc user + if user not in list(hackers.keys()) and user != ircuser: + hackers[user] = random_hacker() + elif user in list(hackers.keys()): + hackers[user][6] = 1 + + def sync_hackers_with_channel(hackers): + users = get_channel_users() + update_hackers_from_users(hackers, users) + + update_hackers_from_users(hackers, users) inotifywm = pyinotify.WatchManager() inotifywm.add_watch("%s/out" % (chanpath), pyinotify.IN_MODIFY) @@ -270,6 +291,10 @@ def main(args): break if rfds == [] and wfds == [] and sfds == []: for hacker in hackers.keys(): + # Is offline. + if hackers[hacker][6] == 0: + continue + hackers[hacker][0] += 5 # Level up every 5 days. newlevel = int(hackers[hacker][0]/(86400*5)) @@ -357,17 +382,35 @@ def main(args): if hacker not in hackers: hackers[hacker] = random_hacker() hacker_info(hackers, hacker) + else: + hackers[hacker][6] = 1 + sync_hackers_with_channel(hackers) elif "has left " in text: penalty = "part" hacker = hacker.split("(", 1)[0] + if hacker in hackers: + hackers[hacker][6] = 0 + sync_hackers_with_channel(hackers) elif "has quit " in text: penalty = "quit" hacker = hacker.split("(", 1)[0] + if hacker in hackers: + hackers[hacker][6] = 0 + sync_hackers_with_channel(hackers) elif "changed nick to " in text: + # TODO: Fix. It is now in channelmaster. + # Instead we sync on part and quit. penalty = "nick" + newhacker = text.split("to ", 1)[1].split("\"")[1] + if newhacker not in hackers: + hackers[newhacker] = random_hacker() + hacker_info(hackers, newhacker) elif "kicked " in text: penalty = "kick" hacker = text.split(" ", 3)[2] + if hacker in hackers: + hackers[hacker][6] = 0 + sync_hackers_with_channel(hackers) if hacker == ircuser: continue