diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/8ball.py | 17 | ||||
| -rw-r--r-- | modules/ducks.py | 429 |
2 files changed, 275 insertions, 171 deletions
diff --git a/modules/8ball.py b/modules/8ball.py index 39e786e0..9c6e5d1a 100644 --- a/modules/8ball.py +++ b/modules/8ball.py @@ -1,4 +1,5 @@ import random +import Utils CHOICES = [ "Definitely", @@ -13,7 +14,18 @@ CHOICES = [ "The answer is unclear", "Absolutely", "Dubious at best", - "I'm on a break, ask again later" + "I'm on a break, ask again later", + "As I see it, yes", + "It is certain", + "Naturally", + "Reply hazy, try again later", + Utils.color(4) + Utils.underline("DO NOT WASTE MY TIME"), + "Hmm... Could be!", + "I'm leaning towards no", + "Without a doubt", + "Sources say no", + "Sources say yes", + "Sources say maybe" ] class Module(object): @@ -26,4 +38,5 @@ class Module(object): ) def decide(selfs, event): - event["stdout"].write(random.choice(CHOICES)) + event["stdout"].write("You shake the magic ball... it " + "says " + Utils.bold(random.choice(CHOICES))) diff --git a/modules/ducks.py b/modules/ducks.py index 4bcef982..3881aaf8 100644 --- a/modules/ducks.py +++ b/modules/ducks.py @@ -1,224 +1,259 @@ +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!", + Utils.underline("I AM THE METAL DUCK")] + +DUCK_MINIMUM_MESSAGES = 10 +DUCK_MINIMUM_UNIQUE = 3 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!") + events.on("received.command.bef").hook(self.befriend, + priority=1, + help="Befriend a " + "duck!") + events.on("received.command.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.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 smount 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}) - exports.add("channelset", {"setting": "ducks-enabled", - "help": "Toggle ducks!", "validate": Utils.bool_or_none}) + exports.add("channelset", {"setting": "ducks-kick", + "help": "Should the bot kick if there's no " + "duck?", + "validate": Utils.bool_or_none}) - events.on("received.numeric.366").hook(self.bootstrap) + events.on("new.channel").hook(self.bootstrap) - events.on("raw").on("376").hook(self.duck_loop_entry) - events.on("timer").on("duck-decoy").hook(self.duck_decoy) - events.on("timer").on("show-duck").hook(self.show_duck) + events.on("received").on("message").on("channel").hook( + self.channel_message, priority=2) - 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) + self.bootstrap_lazy(events) - def bootstrap(self, event): - for server in self.bot.servers.values(): + def bootstrap_lazy(self, event): + servers = self.bot.servers + + for server in servers.values(): for channel in server.channels.values(): - ducks_enabled = channel.get_setting("ducks-enabled", False) + self.bootstrap(channel) - if ducks_enabled == True: - channel.set_setting("active-duck", False) + def bootstrap(self, event): + channel = event["channel"] if hasattr(event, "channel") else event - def duck_enemies(self, event): - the_enemy = event["server"].find_all_user_channel_settings( - "ducks-shot") + self.init_game_var(channel) + # getset + ducks_enabled = channel.get_setting("ducks-enabled", False) - notorious = {} - enemy_nicks = [] - enemy_ducks = [] + if ducks_enabled == True: + self.start_game(channel) - for i in the_enemy: - if i[1] in notorious.keys(): - notorious[i[1]] += i[2] - else: - notorious[i[1]] = i[2] + def is_duck_channel(self, channel): + if channel.get_setting("ducks-enabled", False) == 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') == False: + return False - sentence = "Most Notorious Users -- " + if "ducks" not in channel.games.keys(): + return False - length = len(enemy_nicks) if len(enemy_nicks) < 11 else 11 + return True - for i in range(0, length): - sentence += enemy_nicks[i] + " (" + str(enemy_ducks[i]) + ")" - if i < 10: - sentence += ", " + def init_game_var(self, channel): + if hasattr(channel, 'games') == False: + channel.games = {} - sentence = sentence[0:-2] + def clear_ducks(self, channel): + rand_time = self.generate_next_duck_time() - event["stdout"].write(sentence) + channel.games["ducks"] = {'messages': 0, 'duck_spawned': 0, + 'unique_users': [], + 'next_duck_time': rand_time} - def duck_friends(self, event): - friends = event["server"].find_all_user_channel_settings( - "ducks-befriended") + def start_game(self, channel): + # event is immediately the IRCChannel.Channel() event for the current + # channel + self.clear_ducks(channel) - friendliest = {} - friend_nicks = [] - friend_ducks = [] + def generate_next_duck_time(self): + rand_time = random.randint(int(time()) + 360, int(time()) + 1200) + return rand_time - for i in friends: - if i[1] in friendliest.keys(): - friendliest[i[1]] += i[2] - else: - friendliest[i[1]] = i[2] + def is_duck_visible(self, event): + channel = event["target"] - for user, friends in sorted(friendliest.items(), key = itemgetter(1), - reverse = True): - friend_nicks.append(user) - friend_ducks.append(friends) + visible = bool(channel.games["ducks"]["duck_spawned"]) + return visible - sentence = "Friendliest Users -- " + def should_kick(self, event): + channel = event["target"] + return channel.get_setting("ducks-kick", False) - length = len(friend_nicks) if len(friend_nicks) < 11 else 11 + def kick_bef(self, event): + channel = event["target"] + target = event["user"].nickname - for i in range(0, length): - sentence += friend_nicks[i] + " (" + str(friend_ducks[i]) + ")" - if i < 10: - sentence += ", " + channel.send_kick(target, + "You tried befriending a non-existent duck. Creepy!") - sentence = sentence[0:-2] + def kick_bang(self, event): + channel = event["target"] + target = event["user"].nickname - event["stdout"].write(sentence) + channel.send_kick(target, + "You tried shooting a non-existent duck. Creepy!") - def duck_bef(self, event): - user = event["user"] - target = user.nickname - id = user.get_id() + def should_generate_duck(self, event): + channel = event["channel"] + game = channel.games["ducks"] - active_duck = event["target"].get_setting("active-duck", False) + spawned = game["duck_spawned"] + unique = len(game["unique_users"]) + messages = game["messages"] + next_duck = game["next_duck_time"] - 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") + # 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 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"] + + 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() + 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 + + total_befriended = channel.get_user_setting(uid, "ducks-befriended", 0) + total_befriended = total_befriended + 1 - if ducks_enabled == False: - continue + channel.set_user_setting(uid, "ducks-befriended", total_befriended) - active_duck = channel.get_setting("active-duck", False) + event["stdout"].write( + "Aww! " + nick + " befriended a duck! You've befriended " + + Utils.bold( + str(total_befriended)) + " ducks in " + Utils.bold( + channel.name) + "!") - if ducks_enabled == True and active_duck == False: - channel.send_message(random.choice(DUCK_LIST)) + self.clear_ducks(channel) - channel.set_setting("active-duck", True) + def shoot(self, event): + channel = event["target"] + user = event["user"] + nick = user.nickname + uid = user.get_id() - elif ducks_enabled == True and active_duck == True: - pass + if self.is_duck_channel(channel) == False: + return - else: - channel.set_setting("active-duck", False) + if self.is_duck_visible(event) == False: + if self.should_kick(event): + self.kick_bang(event) + 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)) + channel.games["ducks"][ + "next_duck_time"] = self.generate_next_duck_time() + channel.games["ducks"]["duck_spawned"] = 0 - 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"]) + 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"] @@ -226,11 +261,8 @@ class Module(object): nick = user.nickname id = user.get_id() - poached = user.get_channel_settings_per_setting("ducks-shot", [] - ) - friends = user.get_channel_settings_per_setting( - "ducks-befriended", [] - ) + poached = user.get_channel_settings_per_setting("ducks-shot", []) + friends = user.get_channel_settings_per_setting("ducks-befriended", []) channel_friends = 0 channel_poached = 0 @@ -255,9 +287,68 @@ 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) - + " in " + channel + ")") + 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) |
