import finnhub, json from funcs import getName from .money import checkBalance, addMoney finnhubClient = finnhub.Client(api_key = "bsm16nvrh5rdb4ara3j0") def getPrice(symbol : str): res = finnhubClient.quote(symbol.upper()) if res == {}: return 0 else: return int(res["c"] * 100) def getPortfolio(user : str): with open("resources/games/investments.json") as f: data = json.load(f) if user not in data or data[user] == {}: return f"{getName(user)} does not have a stock portfolio." else: portfolio = f"**Stock portfolio for {getName(user)}**" for key, value in list(data[user].items()): purchaseValue = value["purchased for"] currentValue = int((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(user : str, stock : str, buyAmount : int): if buyAmount >= 100: if checkBalance(user) >= buyAmount: stockPrice = getPrice(stock) if stockPrice > 0: with open("resources/games/investments.json", "r") as f: data = json.load(f) addMoney(user,-1*buyAmount) stock = stock.upper() if user in data: if stock in data[user]: value = data[user][stock] newAmount = int((stockPrice / value["value at purchase"]) * value["purchased"]) + buyAmount data[user][stock]["value at purchase"] = stockPrice data[user][stock]["purchased"] = newAmount if value["purchased for"] != "?": data[user][stock]["purchased for"] += buyAmount else: data[user][stock] = {"purchased" : buyAmount, "value at purchase" : stockPrice, "purchased for" : buyAmount} else: data[user] = {stock : {"purchased" : buyAmount, "value at purchase" : stockPrice, "purchased for" : buyAmount}} with open("resources/games/investments.json", "w") as f: json.dump(data,f,indent=4) return f"{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(user : str, stock : str, sellAmount : int): if sellAmount > 0: with open("resources/games/investments.json", "r") as f: data = json.load(f) stock = stock.upper() if user in data and stock in data[user]: value = data[user][stock] stockPrice = getPrice(stock) data[user][stock]["purchased"] = int((stockPrice / value["value at purchase"]) * value["purchased"]) data[user][stock]["value at purchase"] = stockPrice if value["purchased"] >= sellAmount: addMoney(user,sellAmount) if sellAmount < value["purchased"]: data[user][stock]["purchased"] -= sellAmount data[user][stock]["purchased for"] = "?" else: del data[user][stock] with open("resources/games/investments.json", "w") as f: json.dump(data,f,indent=4) return f"{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(content: str, user : str): if content.startswith("check"): commands = content.split(" ") if len(commands) == 1: return getPortfolio(user) else: price = 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 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 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."