class Invest(): def __init__(self,bot): self.bot = bot def getPrice(self, symbol : str): res = self.bot.finnhubClient.quote(symbol.upper()) if res == {}: return 0 else: return int(res["c"] * 100) def getPortfolio(self, user : str): userInvestments = self.bot.database["investments"].find_one({"_id":user}) if userInvestments in [None,{}]: return f"{self.bot.funcs.getName(user)} does not have a stock portfolio." else: portfolio = f"**Stock portfolio for {self.bot.funcs.getName(user)}**" for key, value in list(userInvestments["investments"].items()): purchaseValue = value["purchased for"] currentValue = int((self.getPrice(key) / value["value at purchase"]) * value["purchased"]) if purchaseValue == "?": portfolio += f"\n**{key}**: ___{str(currentValue)} GwendoBucks___" else: portfolio += f"\n**{key}**: ___{str(currentValue)} GwendoBucks___ (purchased for {str(purchaseValue)})" return portfolio def buyStock(self, user : str, stock : str, buyAmount : int): if buyAmount >= 100: if self.bot.money.checkBalance(user) >= buyAmount: stockPrice = self.getPrice(stock) if stockPrice > 0: userInvestments = self.bot.database["investments"].find_one({"_id":user}) self.bot.money.addMoney(user,-1*buyAmount) stock = stock.upper() if userInvestments != None: userInvestments = userInvestments["investments"] if stock in userInvestments: value = userInvestments[stock] newAmount = int((stockPrice / value["value at purchase"]) * value["purchased"]) + buyAmount self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock+".value at purchase" : stockPrice}}) self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock+".purchased" : newAmount}}) if value["purchased for"] != "?": self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock+".purchased for" : buyAmount}}) else: self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock : {"purchased" : buyAmount, "value at purchase" : stockPrice, "purchased for" : buyAmount}}}) else: newUser = {"_id":user,"investments":{stock : {"purchased" : buyAmount, "value at purchase" : stockPrice, "purchased for" : buyAmount}}} self.bot.database["investments"].insert_one(newUser) return f"{self.bot.funcs.getName(user)} bought {buyAmount} GwendoBucks worth of {stock} stock" else: return f"{stock} is not traded on the american market." else: return "You don't have enough money for that" else: return "You cannot buy stocks for less than 100 GwendoBucks" def sellStock(self, user : str, stock : str, sellAmount : int): if sellAmount > 0: userInvestments = self.bot.database["investments"].find_one({"_id":user})["investments"] stock = stock.upper() if userInvestments != None and stock in userInvestments: value = userInvestments[stock] stockPrice = self.getPrice(stock) self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock+".purchased" : int((stockPrice / value["value at purchase"]) * value["purchased"])}}) self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock+".value at purchase" : stockPrice}}) if value["purchased"] >= sellAmount: self.bot.money.addMoney(user,sellAmount) if sellAmount < value["purchased"]: self.bot.database["investments"].update_one({"_id":user}, {"$inc":{"investments."+stock+".purchased" : -sellAmount}}) self.bot.database["investments"].update_one({"_id":user}, {"$set":{"investments."+stock+".purchased for" : "?"}}) else: self.bot.database["investments"].update_one({"_id":user}, {"$unset":{"investments."+stock:""}}) return f"{self.bot.funcs.getName(user)} sold {sellAmount} GwendoBucks worth of {stock} stock" else: return f"You don't have enough {stock} stocks to do that" else: return f"You don't have any {stock} stock" else: return "no" def parseInvest(self, content: str, user : str): if content.startswith("check"): commands = content.split(" ") if len(commands) == 1: return self.getPortfolio(user) else: price = self.getPrice(commands[1]) if price == 0: return f"{commands[1].upper()} is not traded on the american market." else: price = f"{price:,}".replace(",",".") return f"The current {commands[1].upper()} stock is valued at **{price}** GwendoBucks" elif content.startswith("buy"): commands = content.split(" ") if len(commands) == 3: #try: return self.buyStock(user,commands[1],int(commands[2])) #except: # return "The command must be given as \"!invest buy [stock] [amount of GwendoBucks to purchase with]\"" else: return "You must give both a stock name and an amount of gwendobucks you wish to spend." elif content.startswith("sell"): commands = content.split(" ") if len(commands) == 3: try: return self.sellStock(user,commands[1],int(commands[2])) except: return "The command must be given as \"!invest sell [stock] [amount of GwendoBucks to sell stocks for]\"" else: return "You must give both a stock name and an amount of GwendoBucks you wish to sell stocks for."