diff options
| author | 2018-09-08 16:15:43 +0100 | |
|---|---|---|
| committer | 2018-09-08 16:15:43 +0100 | |
| commit | ac1eef729c929749413cdee31d8ab4643260b7d5 (patch) | |
| tree | eccf4d757e061bd32a1c18b2dfffbd1a0fb0bb1e /modules/ducks.py | |
| parent | Set unique user properly. (diff) | |
New and fresh ducks.py! And an 8ball.py adjustment...!
Diffstat (limited to 'modules/ducks.py')
| -rw-r--r-- | modules/ducks.py | 432 |
1 files changed, 265 insertions, 167 deletions
diff --git a/modules/ducks.py b/modules/ducks.py index 9b2d78f2..a29213ac 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -1,224 +1,261 @@ +import random from operator import itemgetter -from threading import Timer +from time import time + import Utils -import random -DUCK_LIST = [ - "・゜゜・。。・゜ ゜\_O< quack!", - "・゜゜・。。・゜ ゜\_o< QUACK!", - "・゜゜・。 。・゜゜\_ó< quack!", - "・゜゜・。 。・゜゜\_ó< quack quack!", - "・゜゜ 。 。・゜ \_ó< bawk!", - "・゜゜ 。 。・゜゜\_ó< squawk!", - "・ ゜・。 。・゜゜ \_ó< beep beep!" -] +DUCK_TAIL = "・゜゜・。。・゜゜" +DUCK_HEAD = ["\_o< ", "\_O< ", "\_0< ", "\_\u00f6< ", "\_\u00f8< ", + "\_\u00f3< "] +DUCK_MESSAGE = ["QUACK!", "FLAP FLAP!", "quack!", "squawk!"] +DUCK_MESSAGE_RARE = ["beep boop!", "QUACK QUACK QUACK QUACK QUACK!!", + "HONK!", "I AM THE METAL DUCK"] + +DUCK_MINIMUM_MESSAGES = 10 +DUCK_MINIMUM_UNIQUE = 3 + +CHANNELS_ENABLED = [] + class Module(object): + def __init__(self, bot, events, exports): self.bot = bot self.events = events - events.on("received.command.bef").hook(self.duck_bef, - help="Befriend a duck!") - events.on("received.command.bang").hook(self.duck_bang, - help="Shoot a duck! Meanie.") - events.on("received.command.decoy").hook(self.set_decoy, - help="Be a sneaky fellow and make a decoy duck.") - events.on("received.command.friends").hook(self.duck_friends, - help="See who the friendliest people to ducks are!") - events.on("received.command.killers").hook(self.duck_enemies, - help="See who shoots the most amount of ducks.") - events.on("received.command.duckstats").hook(self.duck_stats, - help="Shows your duck " - "stats!") - - - #exports.add("channelset", {"setting": "ducks-enabled", - # "help": "Toggle ducks!", "validate": Utils.bool_or_none}) + events.on("received").on("command").on("bef").hook(self.befriend, + priority=1, + help="Befriend a duck!") + events.on("received").on("command").on("bang").hook(self.shoot, + priority=1, + help="Shoot a " + "duck! " + "Meanie.", + ) + # events.on("received").on("command").on("decoy").hook(self.set_decoy, + # help="Be a + # sneaky fellow + # and make a + # decoy duck!") + events.on("received").on("command").on("friends").hook( + self.duck_friends, + help="See who the friendliest people to ducks are!") + events.on("received").on("command").on("killers").hook( + self.duck_enemies, + help="See who shoots the most smount of ducks!") + events.on("received").on("command").on("duckstats").hook( + self.duck_stats, + help="Shows your duck stats!") - #events.on("received.numeric.366").hook(self.bootstrap) + exports.add("channelset", {"setting": "ducks-enabled", + "help": "Toggle ducks!", + "validate": Utils.bool_or_none}) - #events.on("raw").on("376").hook(self.duck_loop_entry) + exports.add("channelset", {"setting": "ducks-kick", + "help": "Should the bot kick if there's no duck?", + "validate": Utils.bool_or_none}) - #events.on("timer").on("duck-decoy").hook(self.duck_decoy) - #events.on("timer").on("show-duck").hook(self.show_duck) + events.on("new.channel").hook(self.bootstrap) - def duck_loop_entry(self, event): - wait = self.get_random_duck_time() - self.bot.log.info("Sending out a wave of ducks in %s seconds", - [wait]) - self.bot.add_timer("show-duck", wait, persist=False) + events.on("received").on("message").on("channel").hook( + self.channel_message, priority=2) def bootstrap(self, event): - for server in self.bot.servers.values(): - for channel in server.channels.values(): - ducks_enabled = channel.get_setting("ducks-enabled", False) + channel = event["channel"] - if ducks_enabled == True: - channel.set_setting("active-duck", False) + self.init_game_var(channel) + # getset + ducks_enabled = channel.get_setting("ducks-enabled", False) - def duck_enemies(self, event): - the_enemy = event["server"].find_all_user_channel_settings( - "ducks-shot") + if ducks_enabled == True: + self.start_game(channel) - notorious = {} - enemy_nicks = [] - enemy_ducks = [] + def is_duck_channel(self, channel): + if channel.get_setting("ducks-enabled", False) == False: + return False - for i in the_enemy: - if i[1] in notorious.keys(): - notorious[i[1]] += i[2] - else: - notorious[i[1]] = i[2] + if hasattr(channel, 'games') == False: + return False - for user, enemies in sorted(notorious.items(), key=itemgetter(1), - reverse=True): - enemy_nicks.append(user) - enemy_ducks.append(enemies) + if hasattr(channel["games"], 'ducks') == False: + return False - sentence = "Most Notorious Users -- " + return True - length = len(enemy_nicks) if len(enemy_nicks) < 11 else 11 + def init_game_var(self, channel): + if hasattr(channel, 'games') == False: + channel.games = {} - for i in range(0, length): - sentence += enemy_nicks[i] + " (" + str(enemy_ducks[i]) + ")" - if i < 10: - sentence += ", " + def clear_ducks(self, channel): + rand_time = self.generate_next_duck_time() - sentence = sentence[0:-2] + channel.games["ducks"] = { + 'messages': 0, + 'duck_spawned': 0, + 'unique_users': [], + 'next_duck_time': rand_time + } - event["stdout"].write(sentence) + def start_game(self, channel): + # event is immediately the IRCChannel.Channel() event for the current + # channel + self.clear_ducks(channel) - def duck_friends(self, event): - friends = event["server"].find_all_user_channel_settings( - "ducks-befriended") + def generate_next_duck_time(self): + rand_time = random.randint(int(time()) + 300, int(time()) + 1200) + return rand_time - friendliest = {} - friend_nicks = [] - friend_ducks = [] + def is_duck_visible(self, event): + channel = event["target"] - for i in friends: - if i[1] in friendliest.keys(): - friendliest[i[1]] += i[2] - else: - friendliest[i[1]] = i[2] + visible = bool(channel.games["ducks"]["duck_spawned"]) + return visible - for user, friends in sorted(friendliest.items(), key = itemgetter(1), - reverse = True): - friend_nicks.append(user) - friend_ducks.append(friends) + def should_kick(self, event): + channel = event["target"] + return channel.get_setting("ducks-kick", False) - sentence = "Friendliest Users -- " + def kick_bef(self, event): + channel = event["target"] + target = event["user"].nickname - length = len(friend_nicks) if len(friend_nicks) < 11 else 11 + channel.send_kick(target, + "You tried befriending a non-existent duck. Creepy!") - for i in range(0, length): - sentence += friend_nicks[i] + " (" + str(friend_ducks[i]) + ")" - if i < 10: - sentence += ", " + def kick_bang(self, event): + channel = event["target"] + target = event["user"].nickname - sentence = sentence[0:-2] + channel.send_kick(target, + "You tried shooting a non-existent duck. Creepy!") - event["stdout"].write(sentence) + def should_generate_duck(self, event): + channel = event["channel"] + game = channel.games["ducks"] - def duck_bef(self, event): - user = event["user"] - target = user.nickname - id = user.get_id() + spawned = game["duck_spawned"] + unique = len(game["unique_users"]) + messages = game["messages"] + next_duck = game["next_duck_time"] - active_duck = event["target"].get_setting("active-duck", False) + # DUCK_MINIMUM_MESSAGES = 10 + # DUCK_MINIMUM_UNIQUE = 3 - if active_duck == False: - if event["server"].has_user(target): - if not event["server"].is_own_nickname(target): - event["target"].send_kick(target, - "You tried befriending a non-existent duck. Creepy!") - else: - event["stderr"].write("Nope.") - else: - event["stderr"].write("That user is not in this channel") + if spawned == 0 and next_duck < time() and unique > \ + DUCK_MINIMUM_UNIQUE and \ + messages > \ + DUCK_MINIMUM_MESSAGES: + return True else: - befriended_ducks = event["target"].get_user_setting(id, - "ducks-befriended", - 0) - event["target"].set_user_setting(id, - "ducks-befriended", - befriended_ducks + 1) - event["target"].set_setting("active-duck", False) + return False + + def show_duck(self, event): + channel = event["channel"] + duck = "" + + if channel.games["ducks"]["duck_spawned"] == 1: + return + + duck += DUCK_TAIL + duck += random.choice(DUCK_HEAD) + + duck = str(Utils.color(4) + Utils.bold(duck + random.choice( + DUCK_MESSAGE_RARE)) + Utils.color(4)) if 1 == random.randint(1, 20) \ + else duck + random.choice(DUCK_MESSAGE) - grammar = "" if befriended_ducks == 0 else "s" + channel.send_message(duck) + channel.games["ducks"]["duck_spawned"] = 1 - event["stdout"].write( - target + ", you've befriended " + Utils.bold(str( - befriended_ducks + 1)) + " duck" + grammar + " in " + - Utils.bold(event[ - "target"].name)) + def channel_message(self, event): + channel = event["channel"] - self.duck_loop_entry(event) + if "ducks" not in channel.games.keys(): + return - def duck_bang(self, event): user = event["user"] - target = user.nickname - id = user.get_id() - if not event["target"].get_setting("active-duck", False): - event["stderr"].set_prefix("Kick") - if event["server"].has_user(target): - if not event["server"].is_own_nickname(target): - event["target"].send_kick(target, - "You tried shooting a non-existent duck. Creepy!") - else: - event["stderr"].write("Nope.") - else: - event["stderr"].write("That user is not in this channel") + game = channel.games["ducks"] + delay_increment = 0 + + if game["duck_spawned"] == 1 or channel.has_user( + event["user"]) == False: + return + + unique = game["unique_users"] + messages = game["messages"] + + if user not in unique: + game["unique_users"].append(user) + messages_increment = 1 else: - shot_ducks = event["target"].get_user_setting(id, "ducks-shot", 0) - event["target"].set_user_setting(id, "ducks-shot", shot_ducks + 1) - event["target"].set_setting("active-duck", False) + messages_increment = 0.5 - grammar = "" if shot_ducks == 0 else "s" + game["messages"] = messages + messages_increment - event["stdout"].write( - target + ", you've shot " - + Utils.bold(str(shot_ducks + 1)) + " duck" - + grammar + " in " - + Utils.bold(event["target"].name)) + if self.should_generate_duck(event) == True: + self.show_duck(event) - self.duck_loop_entry(event) + def befriend(self, event): + channel = event["target"] + user = event["user"] + nick = user.nickname + uid = user.get_id() + print(channel) + if self.is_duck_channel(channel) == False: + return - def get_random_duck_time(self): - return random.randint(720, 3600) + if self.is_duck_visible(event) == False: + if self.should_kick(event): + self.kick_bef(event) + return - def show_duck(self, event): - for server in self.bot.servers.values(): - for channel in server.channels.values(): - ducks_enabled = channel.get_setting("ducks-enabled", False) + channel.games["ducks"][ + "next_duck_time"] = self.generate_next_duck_time() + channel.games["ducks"]["duck_spawned"] = 0 - if ducks_enabled == False: - continue + total_befriended = channel.get_user_setting(uid, "ducks-befriended", 0) + total_befriended = total_befriended + 1 - active_duck = channel.get_setting("active-duck", False) + channel.set_user_setting(uid, "ducks-befriended", total_befriended) - if ducks_enabled == True and active_duck == False: - channel.send_message(random.choice(DUCK_LIST)) + event["stdout"].write( + "Aww! " + nick + " befriended a duck! You've befriended " + + Utils.bold( + str( + total_befriended)) + " ducks in " + Utils.bold( + channel.name) + "!") - channel.set_setting("active-duck", True) + self.clear_ducks(channel) - elif ducks_enabled == True and active_duck == True: - pass + def shoot(self, event): + channel = event["target"] + user = event["user"] + nick = user.nickname + uid = user.get_id() - else: - channel.set_setting("active-duck", False) + if self.is_duck_channel(channel) == False: + return - def duck_decoy(self, event): - self.events.on("send").on("stdout").call(target=event["channel"], - module_name="Ducks", server=event["server"], - message=random.choice(DUCK_LIST)) + if self.is_duck_visible(event) == False: + if self.should_kick(event): + self.kick_bang(event) + return - def set_decoy(self, event): - next_decoy_time = self.get_random_duck_time() - self.bot.add_timer("duck-decoy", next_decoy_time, persist=False, - server=event["server"], channel=event["target"]) + channel.games["ducks"][ + "next_duck_time"] = self.generate_next_duck_time() + channel.games["ducks"]["duck_spawned"] = 0 + total_shot = channel.get_user_setting(uid, "ducks-shot", 0) + total_shot = total_shot + 1 + + channel.set_user_setting(uid, "ducks-shot", total_shot) + + event["stdout"].write( + "Pow! " + nick + " shot a duck! You've shot " + Utils.bold( + str( + total_shot)) + " ducks in " + Utils.bold( + channel.name) + "!") + + self.clear_ducks(channel) def duck_stats(self, event): user = event["user"] @@ -229,8 +266,8 @@ class Module(object): poached = user.get_channel_settings_per_setting("ducks-shot", [] ) friends = user.get_channel_settings_per_setting( - "ducks-befriended", [] - ) + "ducks-befriended", [] + ) channel_friends = 0 channel_poached = 0 @@ -255,9 +292,70 @@ class Module(object): event["stdout"].write( nick + ": " + str(total_poached) + " ducks killed (" + str( channel_poached) + " in " + channel + "), and " + str( - total_friends) + " ducks befriended (" + str(channel_friends) + total_friends) + " ducks befriended (" + str( + channel_friends) + " in " + channel + ")") + def duck_enemies(self, event): + the_enemy = event["server"].find_all_user_channel_settings( + "ducks-shot") + + notorious = {} + enemy_nicks = [] + enemy_ducks = [] + + for i in the_enemy: + if i[1] in notorious.keys(): + notorious[i[1]] += i[2] + else: + notorious[i[1]] = i[2] + + for user, enemies in sorted(notorious.items(), key=itemgetter(1), + reverse=True): + enemy_nicks.append(user) + enemy_ducks.append(enemies) + + sentence = "Most Notorious Users -- " + + length = len(enemy_nicks) if len(enemy_nicks) < 11 else 11 + + for i in range(0, length): + sentence += enemy_nicks[i] + " (" + str(enemy_ducks[i]) + ")" + if i < 10: + sentence += ", " + + sentence = sentence[0:-2] + + event["stdout"].write(sentence) + + def duck_friends(self, event): + friends = event["server"].find_all_user_channel_settings( + "ducks-befriended") + + friendliest = {} + friend_nicks = [] + friend_ducks = [] + + for i in friends: + if i[1] in friendliest.keys(): + friendliest[i[1]] += i[2] + else: + friendliest[i[1]] = i[2] + + for user, friends in sorted(friendliest.items(), key=itemgetter(1), + reverse=True): + friend_nicks.append(user) + friend_ducks.append(friends) + + sentence = "Friendliest Users -- " - + length = len(friend_nicks) if len(friend_nicks) < 11 else 11 + for i in range(0, length): + sentence += friend_nicks[i] + " (" + str(friend_ducks[i]) + ")" + if i < 10: + sentence += ", " + + sentence = sentence[0:-2] + + event["stdout"].write(sentence) |
