From 000ee147117a664a3663ebf040378eb9ff0b727e Mon Sep 17 00:00:00 2001 From: dngfx Date: Sat, 22 Sep 2018 16:02:39 +0100 Subject: Make tweets say Twitter instead of tweets, and update ducks to add decoys and make minimum/unique a channel setting rather than hard setting. --- modules/ducks.py | 105 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 90 insertions(+), 15 deletions(-) (limited to 'modules/ducks.py') diff --git a/modules/ducks.py b/modules/ducks.py index 86bb2f0c..7fa32910 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -23,9 +23,16 @@ class Module(object): self.events = events events.on("received.command.bef").hook(self.befriend, - priority=EventManager.PRIORITY_HIGH, help="Befriend a duck!") + priority=EventManager.PRIORITY_HIGH, + help="Befriend a duck!") events.on("received.command.bang").hook(self.shoot, - priority=EventManager.PRIORITY_HIGH, help="Shoot a duck! Meanie.") + priority=EventManager.PRIORITY_HIGH, + help="Shoot a duck! Meanie.") + events.on("received.command.decoy").hook( + self.duck_decoy, + priority=EventManager.PRIORITY_HIGH, + help="Lay out a sneaky decoy!") + events.on("received.command.friends").hook(self.duck_friends, help="See who the friendliest people to ducks are!") @@ -41,10 +48,20 @@ class Module(object): "help": "Should the bot kick if there's no duck?", "validate": Utils.bool_or_none}) + exports.add("channelset", {"setting": "ducks-min-unique", + "help": "Minimum unique users required to " + "talk before a duck spawns.", + "validate": Utils.int_or_none}) + + exports.add("channelset", {"setting": "ducks-min-messages", + "help": "Minimum messages between ducks " + "spawning.", + "validate": Utils.int_or_none}) + events.on("new.channel").hook(self.new_channel) events.on("received.message.channel").hook( - self.channel_message) + self.channel_message, EventManager.PRIORITY_LOW) for server in self.bot.servers.values(): for channel in server.channels.values(): @@ -53,6 +70,9 @@ class Module(object): def new_channel(self, event): self.bootstrap(event["channel"]) + def has_command(self, command): + return command.lower() in self.events.on("received").on("command").get_children() + def bootstrap(self, channel): self.init_game_var(channel) # getset @@ -82,25 +102,39 @@ class Module(object): channel.games["ducks"] = {'messages': 0, 'duck_spawned': 0, 'unique_users': [], - 'next_duck_time': rand_time} + 'next_duck_time': rand_time, + 'decoy_spawned': 0, 'decoy_requested': 0, + 'next_decoy_time': rand_time} def start_game(self, channel): # event is immediately the IRCChannel.Channel() event for the current # channel self.clear_ducks(channel) + min_unique = channel.get_setting("ducks-min-unique", + 0) + min_messages = channel.get_setting("ducks-min-messages", + 0) + + if min_unique == 0: + channel.set_setting("ducks-min-unique", DUCK_MINIMUM_UNIQUE) + + if min_messages == 0: + channel.set_setting("ducks-min-messages", DUCK_MINIMUM_MESSAGES) + def generate_next_duck_time(self): - rand_time = random.randint(int(time()) + 360, int(time()) + 1200) + rand_time = random.randint(int(time()) + 1, int(time()) + 2) return rand_time def is_duck_visible(self, event): channel = event["target"] - visible = bool(channel.games["ducks"]["duck_spawned"]) + visible = channel.games["ducks"]["duck_spawned"] return visible def should_kick(self, event): channel = event["target"] + return channel.get_setting("ducks-kick", False) def kick_bef(self, event): @@ -117,29 +151,53 @@ class Module(object): channel.send_kick(target, "You tried shooting a non-existent duck. Creepy!") + def duck_decoy(self, event): + channel = event["target"] + if self.is_duck_channel(channel) == False: + return + + if self.is_duck_visible(event): + return + + game = channel.games["ducks"] + game["decoy_requested"] = 1 + + event.eat() + + def should_generate_duck(self, event): channel = event["channel"] game = channel.games["ducks"] - spawned = game["duck_spawned"] + spawned = int(game["decoy_spawned"] or game["duck_spawned"]) + decoy = bool(game["decoy_requested"]) unique = len(game["unique_users"]) messages = game["messages"] - next_duck = game["next_duck_time"] + next_duck = game["next_decoy_time"] if decoy else game["next_duck_time"] + + min_unique = 1 if decoy else channel.get_setting("ducks-min-unique", + DUCK_MINIMUM_UNIQUE) + min_messages = channel.get_setting("ducks-min-messages", DUCK_MINIMUM_MESSAGES) + + requirement = (unique >= min_unique and messages >= min_messages) # DUCK_MINIMUM_MESSAGES = 10 # DUCK_MINIMUM_UNIQUE = 3 - if spawned == 0 and next_duck < time() and unique >= \ - DUCK_MINIMUM_UNIQUE and messages >= DUCK_MINIMUM_MESSAGES: - return True + if spawned == 0 and next_duck < time(): + if requirement: + return True + else: + return False else: return False def show_duck(self, event): channel = event["channel"] + game = channel.games["ducks"] duck = "" - if channel.games["ducks"]["duck_spawned"] == 1: + if game["duck_spawned"] == 1 or game["decoy_spawned"] == 1: return duck += DUCK_TAIL @@ -154,7 +212,15 @@ class Module(object): duck += random.choice(DUCK_MESSAGE) channel.send_message(duck) - channel.games["ducks"]["duck_spawned"] = 1 + + # Decoys take priority over regular ducks. + if game["decoy_requested"] == 1: + game["decoy_spawned"] = 1 + game["decoy_requested"] = 0 + + game["next_duck_time"] = self.generate_next_duck_time() + else: + game["duck_spawned"] = 1 def channel_message(self, event): if not event["channel"].get_setting("ducks-enabled", False): @@ -167,8 +233,8 @@ class Module(object): user = event["user"] game = channel.games["ducks"] - if game["duck_spawned"] == 1 or channel.has_user( - event["user"]) == False: + if game["decoy_spawned"] == 1 or game["duck_spawned"] == 1 or \ + channel.has_user(event["user"]) == False: return unique = game["unique_users"] @@ -196,6 +262,8 @@ class Module(object): if self.is_duck_visible(event) == False: if self.should_kick(event): self.kick_bef(event) + self.clear_ducks(channel) + event.eat() return channel.games["ducks"][ @@ -214,6 +282,7 @@ class Module(object): event["stdout"].write(msg) self.clear_ducks(channel) + event.eat() def shoot(self, event): channel = event["target"] @@ -227,6 +296,8 @@ class Module(object): if self.is_duck_visible(event) == False: if self.should_kick(event): self.kick_bang(event) + self.clear_ducks(channel) + event.eat() return channel.games["ducks"][ @@ -245,6 +316,7 @@ class Module(object): event["stdout"].write(msg) self.clear_ducks(channel) + event.eat() def duck_stats(self, event): user = event["user"] @@ -285,6 +357,7 @@ class Module(object): Utils.bold(tf), Utils.bold(cf), Utils.bold(channel)) event["stdout"].write(Utils.bold(nick) + ": " + msg) + event.eat() def duck_enemies(self, event): the_enemy = event["server"].find_all_user_channel_settings("ducks-shot") @@ -318,6 +391,7 @@ class Module(object): sentence += ", ".join(build) event["stdout"].write(sentence) + event.eat() def duck_friends(self, event): friends = event["server"].find_all_user_channel_settings( @@ -353,3 +427,4 @@ class Module(object): sentence += ", ".join(build) event["stdout"].write(sentence) + event.eat() -- cgit v1.3.1-10-gc9f91 From febb6d66e3fd29c5d18c4c49133b0aef9257f2e1 Mon Sep 17 00:00:00 2001 From: dngfx Date: Sat, 22 Sep 2018 19:10:52 +0100 Subject: font reset at the beginning of commands to stop wonkiness with highlighting and fix duck decoys. --- modules/commands.py | 3 ++- modules/ducks.py | 16 ++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) (limited to 'modules/ducks.py') diff --git a/modules/commands.py b/modules/commands.py index f0068c57..9df70ffc 100644 --- a/modules/commands.py +++ b/modules/commands.py @@ -29,7 +29,8 @@ class Out(object): ].decode("utf8").lstrip()) else: self._text = "" - self.target.send_message(text, prefix="[%s] " % self.prefix()) + self.target.send_message(text, prefix=Utils.FONT_RESET + "[%s] " % + self.prefix()) def set_prefix(self, prefix): self.module_name = prefix def has_text(self): diff --git a/modules/ducks.py b/modules/ducks.py index 7fa32910..ebef9006 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -100,6 +100,7 @@ class Module(object): def clear_ducks(self, channel): rand_time = self.generate_next_duck_time() + del channel.games["ducks"] channel.games["ducks"] = {'messages': 0, 'duck_spawned': 0, 'unique_users': [], 'next_duck_time': rand_time, @@ -126,10 +127,11 @@ class Module(object): rand_time = random.randint(int(time()) + 1, int(time()) + 2) return rand_time - def is_duck_visible(self, event): + def is_duck_visible(self, event, decoy=False): channel = event["target"] - visible = channel.games["ducks"]["duck_spawned"] + visible = channel.games["ducks"]["decoy_spawned"] if \ + decoy else channel.games["ducks"]["duck_spawned"] return visible def should_kick(self, event): @@ -259,11 +261,12 @@ class Module(object): if self.is_duck_channel(channel) == False: return - if self.is_duck_visible(event) == False: + if self.is_duck_visible(event, False) == False: if self.should_kick(event): self.kick_bef(event) - self.clear_ducks(channel) event.eat() + + self.clear_ducks(channel) return channel.games["ducks"][ @@ -293,11 +296,12 @@ class Module(object): if self.is_duck_channel(channel) == False: return - if self.is_duck_visible(event) == False: + if self.is_duck_visible(event, False) == False: if self.should_kick(event): self.kick_bang(event) - self.clear_ducks(channel) event.eat() + + self.clear_ducks(channel) return channel.games["ducks"][ -- cgit v1.3.1-10-gc9f91 From 1a54c11df8210cd87d800ff23f09c07c7ff21d87 Mon Sep 17 00:00:00 2001 From: dngfx Date: Sat, 22 Sep 2018 19:28:57 +0100 Subject: Fix ducks.py having a superfluous function --- modules/ducks.py | 3 --- 1 file changed, 3 deletions(-) (limited to 'modules/ducks.py') diff --git a/modules/ducks.py b/modules/ducks.py index ebef9006..a25c05d0 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -70,9 +70,6 @@ class Module(object): def new_channel(self, event): self.bootstrap(event["channel"]) - def has_command(self, command): - return command.lower() in self.events.on("received").on("command").get_children() - def bootstrap(self, channel): self.init_game_var(channel) # getset -- cgit v1.3.1-10-gc9f91 From 56afe77b5230a929c96f6fbc68d5699c214d10e4 Mon Sep 17 00:00:00 2001 From: dngfx Date: Sat, 22 Sep 2018 19:32:54 +0100 Subject: Fix duck timing and stupid indenting. --- modules/ducks.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'modules/ducks.py') diff --git a/modules/ducks.py b/modules/ducks.py index a25c05d0..33d8e5e6 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -109,10 +109,8 @@ class Module(object): # channel self.clear_ducks(channel) - min_unique = channel.get_setting("ducks-min-unique", - 0) - min_messages = channel.get_setting("ducks-min-messages", - 0) + min_unique = channel.get_setting("ducks-min-unique", 0) + min_messages = channel.get_setting("ducks-min-messages", 0) if min_unique == 0: channel.set_setting("ducks-min-unique", DUCK_MINIMUM_UNIQUE) @@ -121,7 +119,7 @@ class Module(object): channel.set_setting("ducks-min-messages", DUCK_MINIMUM_MESSAGES) def generate_next_duck_time(self): - rand_time = random.randint(int(time()) + 1, int(time()) + 2) + rand_time = random.randint(int(time()) + 360, int(time()) + 1200) return rand_time def is_duck_visible(self, event, decoy=False): -- cgit v1.3.1-10-gc9f91 From 9220f84c277df19f72195371fabd140883ad5708 Mon Sep 17 00:00:00 2001 From: dngfx Date: Sat, 22 Sep 2018 20:08:07 +0100 Subject: clear channel.games properly. --- modules/ducks.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'modules/ducks.py') diff --git a/modules/ducks.py b/modules/ducks.py index 33d8e5e6..c2ae696c 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -97,7 +97,9 @@ class Module(object): def clear_ducks(self, channel): rand_time = self.generate_next_duck_time() - del channel.games["ducks"] + if hasattr(channel.games, "ducks"): + del channel.games["ducks"] + channel.games["ducks"] = {'messages': 0, 'duck_spawned': 0, 'unique_users': [], 'next_duck_time': rand_time, -- cgit v1.3.1-10-gc9f91