From f4f8eec2a67ff916587c6dccef8aa3e9f3363d83 Mon Sep 17 00:00:00 2001 From: louis chauvet Date: Mon, 20 Aug 2018 11:18:47 +0200 Subject: [PATCH] Basic commands for deeptown optimizer --- main.py | 4 +- modules/__init__.py | 0 modules/deeptown.py | 69 ++++++++++++++++++++++++++ modules/deeptownOptimizer/__init__.py | 0 modules/deeptownOptimizer/items.json | 65 ++++++++++++++++++++++++ modules/deeptownOptimizer/mines.json | 54 ++++++++++++++++++++ modules/deeptownOptimizer/optimizer.py | 55 ++++++++++++++++++++ traductions.py | 15 +++++- 8 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 modules/__init__.py create mode 100644 modules/deeptown.py create mode 100644 modules/deeptownOptimizer/__init__.py create mode 100644 modules/deeptownOptimizer/items.json create mode 100644 modules/deeptownOptimizer/mines.json create mode 100644 modules/deeptownOptimizer/optimizer.py diff --git a/main.py b/main.py index 3fe310a..e3e5aa2 100644 --- a/main.py +++ b/main.py @@ -96,7 +96,7 @@ class Guild: for module in module_to_load: # Try to load all modules by name - if module not in self.bot.modules.keys(): + if module not in self.bot.modules.keys() or module.startswith("_"): # Module is not an existing module self.config["modules"].remove(module) # Write an error in log @@ -132,7 +132,7 @@ class FoBot(discord.Client): def load_modules(self): for module in os.listdir('modules'): - if module != "__pycache__" and module.endswith(".py"): + if module[0] != "_" and module.endswith(".py"): imported = importlib.import_module('modules.' + module[:-3]) self.modules.update({module[:-3]: imported.MainClass}) diff --git a/modules/__init__.py b/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/deeptown.py b/modules/deeptown.py new file mode 100644 index 0000000..cad7087 --- /dev/null +++ b/modules/deeptown.py @@ -0,0 +1,69 @@ +import datetime + +import discord +import traductions as tr +import modules.deeptownOptimizer.optimizer as optimizer + + +class MainClass: + name = "deeptown" + + def __init__(self, guild): + self.guild = guild + self.optimizer = optimizer.Optimizer() + + async def best_place_mine(self, msg, command, args): + if args[0] not in self.optimizer.mines["0"].keys(): + await msg.channel.send(tr.tr[self.guild.config["lang"]]["error"]["OreNotFoundError"].format(ore=args[0])) + return + else: + text = tr.tr[self.guild.config["lang"]]["modules"]["deeptown"].format(ore=args[0]) + i = 0 + for mine in self.optimizer.best_mines(args[0]): + if i >= 10: + break + if mine[0] == "0": + continue + text += mine[0].center(3, " ") + text += ": " + text += str(mine[1][args[0]] * 100) + text += "%\n" + i += 1 + text += "```" + await msg.channel.send(text) + return + return + + async def reload_optimizer(self, msg, command, args): + if msg.author.id not in self.guild.config["master_admins"]: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return + else: + self.optimizer = optimizer.Optimizer() + + async def to_make(self, msg, command, args): + if args[0] not in self.optimizer.items.keys(): + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["ItemNotFound"].format(item=args[0])) + try: + quantity = int(args[1]) + except ValueError: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["NotIntError"].format(number=args[1])) + return + result = self.optimizer.to_make(args[0], quantity) + time = datetime.timedelta(seconds=int(result["time"])) + needed = ", ".join([str(quantity) + " " + name for name, quantity in result["needed"].items()]) + await msg.channel.send( + tr.tr[self.guild.config["lang"]]["modules"]["deeptown"]["to_make"].format(time=time, quantity=quantity, + item=args[0], needed=needed, + value=result["value"])) + + async def on_message(self, msg): + if msg.content.startswith(self.guild.config["prefix"]): + command, *args = msg.content.lstrip(self.guild.config["prefix"]).split(" ") + if command == "best_place_mine": + await self.best_place_mine(msg, command, args) + elif command == "reload_optimizer": + await self.reload_optimizer(msg, command, args) + elif command == "to_make": + await self.to_make(msg, command, args) + return diff --git a/modules/deeptownOptimizer/__init__.py b/modules/deeptownOptimizer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/deeptownOptimizer/items.json b/modules/deeptownOptimizer/items.json new file mode 100644 index 0000000..6a21744 --- /dev/null +++ b/modules/deeptownOptimizer/items.json @@ -0,0 +1,65 @@ +{ + "graphite": { + "value": 15, + "time": 5, + "quantity": 1, + "required": { + "coal": 1 + }, + "building": "crafting" + }, + "copperBar": { + "value": 25, + "time": 10, + "quantity": 1, + "required": { + "copper": 5 + }, + "building": "smelting" + }, + "ironBar": { + "value": 40, + "time": 15, + "quantity": 1, + "required": { + "iron": 5 + }, + "building": "smelting" + }, + "amberCharger": { + "value": 4, + "time": 5, + "quantity": 1, + "required": { + "amber": 1 + }, + "building": "crafting" + }, + "polishedAmber": { + "value": 70, + "time": 30, + "quantity": 1, + "required": { + "amber": 5 + }, + "bullding": "jewel" + }, + "goldBar": { + "value": 40, + "time": 15, + "quantity": 1, + "required": { + "gold": 5 + }, + "building": "smelting" + }, + "copperNail": { + "value": 7, + "time": 20, + "quantity": 10, + "required": { + "copperBar": 1 + }, + "building": "crafting" + } +} diff --git a/modules/deeptownOptimizer/mines.json b/modules/deeptownOptimizer/mines.json new file mode 100644 index 0000000..8eca240 --- /dev/null +++ b/modules/deeptownOptimizer/mines.json @@ -0,0 +1,54 @@ +{ + "0": { + "coal": 0, + "copper": 0, + "iron": 0, + "amber": 0, + "gold": 0, + "aluminium": 0, + "silver": 0, + "emerald": 0, + "ruby": 0, + "diamond": 0, + "topaz": 0, + "sapphire": 0, + "amethyst": 0, + "alexandrite": 0, + "titanium": 0, + "uranium": 0, + "platinum": 0, + "helium3": 0, + "obsidian": 0 + }, + "1": { + "coal": 1 + }, + "2": { + "coal": 0.70, + "copper": 0.30 + }, + "3": { + "coal": 0.595, + "copper": 0.2833, + "iron": 0.0917, + "amber": 0.025, + "gold": 0.005 + }, + "4": { + "coal": 0.5425, + "copper": 0.325, + "iron": 0.1025, + "amber": 0.0225, + "gold": 0.0075 + }, + "5": { + "coal": 0.4900, + "copper": 0.3667, + "iron": 0.1133, + "amber": 0.0200, + "gold": 0.0100 + }, + "13": { + "copper": 1 + } +} \ No newline at end of file diff --git a/modules/deeptownOptimizer/optimizer.py b/modules/deeptownOptimizer/optimizer.py new file mode 100644 index 0000000..534bb84 --- /dev/null +++ b/modules/deeptownOptimizer/optimizer.py @@ -0,0 +1,55 @@ +import copy +import datetime +import json +import os + + +class Optimizer(): + def __init__(self): + self.mines = {} + self.items = {} + # get mine stats + with open(os.path.join("modules", "deeptownOptimizer", "mines.json")) as mines: + self.mines = json.load(mines) + # get items stats + with open(os.path.join("modules", "deeptownOptimizer", "items.json")) as items: + self.items = json.load(items) + # Add zero values to mine stat + ores = self.mines["0"].keys() + for area, stats in self.mines.items(): + for ore in ores: + if self.mines[area].get(ore) is None: + self.mines[area].update({ore: 0}) + print(self.mines) + + def best_mines(self, ore): + if ore not in self.mines["0"].keys(): + raise ValueError("{ore} is not a correct ore.".format(ore=ore)) + ordered_mines = [(k, v) for k, v in self.mines.items()] + ordered_mines.sort(key=lambda x: x[1][ore], reverse = True) + return ordered_mines + + def to_make(self, item, quantity=1): + if item not in self.items.keys(): + raise ValueError("{item} is not a correct item.".format(item=item)) + number_of_craft = quantity/self.items[item]["quantity"] + if number_of_craft % 1 != 0: + number_of_craft = (number_of_craft // 1)+1 + time = self.items[item]["time"]*number_of_craft + value = self.items[item]["value"]*number_of_craft*self.items[item]["quantity"] + needed = {} + for resource, quantity in self.items[item]["required"].items(): + needed.update({resource: quantity*number_of_craft}) + return {"time": time, "value": value, "needed": needed} + + def recursive_to_make(self, item, quantity=1): + # Compute needed time and resource for craft item + result = self.to_make(item, quantity) + # For each needed resource try to craft it + for i, q in result["needed"].keys(): + try: + temp_result = self.recursive_to_make(i, g) + result["time"] = result["time"] + temp_result["time"] + for + + return result diff --git a/traductions.py b/traductions.py index 822904d..f8c68d3 100644 --- a/traductions.py +++ b/traductions.py @@ -3,7 +3,7 @@ tr = { "description": "Français", "modules": { "modules": { - "description": "Permet de gérer les modules.", + "description": "Gestion des modules.", "aide": { "list_modules": { "description": "Liste tous les modules. Les modules en gras sont activés.", @@ -75,6 +75,14 @@ tr = { "add_master_admin": "L'utilisateur {user} est maintenant un administrateur du bot.", "del_master_admin": "L'utilisateur {user} n'est plus un administrateur du bot.", }, + "deeptown": { + "description": "Commandes relatives au jeu deeptown.", + "aide":{ + + }, + "best_place_mine":"Voici les meilleurs emplacements pour le minerais {ore}\n```\n", + "to_make":"Pour faire {quantity} {item} il faudra {time}. Il vous faudra {needed}. La valeur totale de la production est {value}.", + }, }, "errors": { "LangNotFoundError": "La langue {lang} est introuvable, tapez {prefix}list_lang pour voir les langues " @@ -97,7 +105,10 @@ tr = { "modifiables.", "NotEnoughParamError": "Il manque un ou plusieurs parametres à la commande.", "NoMentionsError": "Vous devez mentioner un utilisateur pour le rajouter à la liste des administrateurs " - "du bot." + "du bot.", + "OreNotFoundError": "{ore} n'est pas un minerais valide.", + "NotIntError":"{number} n'est pas un nombre entier valide.", + "ItemNotFoundError":"{item} n'extiste pas dans deeptown", }, }, }