aboutsummaryrefslogtreecommitdiff
path: root/code/cogs/crypto.py
blob: 9ef8984a668fed1fde83b0218ce8f0a8c9c2349b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import discord
from discord.ext import commands, tasks
from discord import app_commands
from typing import Literal
from decimal import Decimal
import requests

from global_variables import CRYPTO_COMPARE_API_KEY


master_dict = {'Bitcoin (BTC)':'0:0:0:0:0:0', 'Ethereum (ETH)':'0:0:0:0:0:0',
    'Binance Coin (BNB)':'0:0:0:0:0:0', 'Solana (SOL)':'0:0:0:0:0:0', 'Cardano (ADA)':'0:0:0:0:0:0',
    'XRP (XRP)':'0:0:0:0:0:0', 'Polkadot (DOT)':'0:0:0:0:0:0','Dogecoin (DOGE)':'0:0:0:0:0:0',
    'Avalanche (AVAX)':'0:0:0:0:0:0', 'SHIBA INU (SHIB)':'0:0:0:0:0:0', 'Terra (LUNA)':'0:0:0:0:0:0',
    'Litecoin (LTC)':'0:0:0:0:0:0', 'Uniswap (UNI)':'0:0:0:0:0:0', 'Chainlink (LINK)':'0:0:0:0:0:0',
    'Polygon (MATIC)':'0:0:0:0:0:0', 'Algorand (ALGO)':'0:0:0:0:0:0', 'Bitcoin Cash (BCH)':'0:0:0:0:0:0',
    'VeChain (VET)':'0:0:0:0:0:0', 'Stellar (XLM)':'0:0:0:0:0:0', 'Internet Computer (ICP)':'0:0:0:0:0:0'}

currencies = ['Bitcoin (BTC)', 'Ethereum (ETH)', 'Binance Coin (BNB)', 'Solana (SOL)',
    'Cardano (ADA)', 'XRP (XRP)', 'Polkadot (DOT)', 'Dogecoin (DOGE)', 'Avalanche (AVAX)',
    'SHIBA INU (SHIB)', 'Terra (LUNA)', 'Litecoin (LTC)', 'Uniswap (UNI)', 'Chainlink (LINK)',
    'Polygon (MATIC)', 'Algorand (ALGO)', 'Bitcoin Cash (BCH)', 'VeChain (VET)', 'Stellar (XLM)',
    'Internet Computer (ICP)']

connect_color_dict = {'Bitcoin (BTC)':0xf7931a, 'Ethereum (ETH)':0x627eea,
    'Binance Coin (BNB)':0xf3ba2f, 'Solana (SOL)':0x27dcb8, 'Cardano (ADA)':0x3cc8c8,
    'XRP (XRP)':0x00aae4, 'Polkadot (DOT)':0xf0047f,'Dogecoin (DOGE)':0xc3a634,
    'Avalanche (AVAX)':0xe84142, 'SHIBA INU (SHIB)':0xe93b24, 'Terra (LUNA)':0x5494f8,
    'Litecoin (LTC)':0x345d9d, 'Uniswap (UNI)':0xff027d, 'Chainlink (LINK)':0x335dd2,
    'Polygon (MATIC)':0x2bbdf7, 'Algorand (ALGO)':0x000000, 'Bitcoin Cash (BCH)':0x8dc351,
    'VeChain (VET)':0x15bdff, 'Stellar (XLM)':0x14b6e7, 'Internet Computer (ICP)':0xf15a24}

connect_icon_dict = {'Bitcoin (BTC)':'bitcoin', 'Ethereum (ETH)':'ethereum',
    'Binance Coin (BNB)':'binance', 'Solana (SOL)':'solana', 'Cardano (ADA)':'cardano',
    'XRP (XRP)':'xrp', 'Polkadot (DOT)':'polkadot','Dogecoin (DOGE)':'dogecoin',
    'Avalanche (AVAX)':'avalanche', 'SHIBA INU (SHIB)':'shiba', 'Terra (LUNA)':'terra',
    'Litecoin (LTC)':'litecoin', 'Uniswap (UNI)':'uniswap', 'Chainlink (LINK)':'chainlink',
    'Polygon (MATIC)':'polygon', 'Algorand (ALGO)':'algorand', 'Bitcoin Cash (BCH)':'bitcoin_cash',
    'VeChain (VET)':'vechain', 'Stellar (XLM)':'stellar', 'Internet Computer (ICP)':'internet_computer'}

class Crypto(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    async def cog_load(self):
        self.update_crypto.start()

    def update_dicts_for_currency(self, response, cut_currency, currency):
        round_num = 8 if cut_currency == 'SHIB' else 3 if cut_currency == 'DOGE' else 3 if cut_currency == 'VET' else 3 if cut_currency == 'XLM' else 2
        market = response.json()['RAW'][cut_currency]['USD']['LASTMARKET']
        price = round(Decimal(response.json()['RAW'][cut_currency]['USD']['PRICE']), round_num)
        change_24h = round(Decimal(response.json()['RAW'][cut_currency]['USD']['CHANGEPCT24HOUR']), 2)
        high = round(Decimal(response.json()['RAW'][cut_currency]['USD']['HIGH24HOUR']), round_num)
        low = round(Decimal(response.json()['RAW'][cut_currency]['USD']['LOW24HOUR']), round_num)
        mktcap = round(Decimal(response.json()['RAW'][cut_currency]['USD']['MKTCAP']), 2)

        master_dict[currency] = f'{market}:{price}:{change_24h}:{high}:{low}:{mktcap}'

    @tasks.loop(seconds=60)
    async def update_crypto(self):
        response = requests.get(
            f'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,BNB,SOL,ADA,XRP,DOT,DOGE,AVAX,SHIB,LUNA,LTC,UNI,LINK,MATIC,ALGO,BCH,VET,XLM,ICP&tsyms=USD&api_key={CRYPTO_COMPARE_API_KEY}'
        )
        for currency in currencies:
            cut_currency = currency[currency.find("(")+1:currency.find(")")]
            self.update_dicts_for_currency(response, cut_currency, currency)


    @app_commands.command()
    async def prices(
        self,
        interaction: discord.Interaction,
    ):
        "See the current crypto prices"
        embed = discord.Embed(
            title="Current Crpytocurrency Price",
            description=f"**In order to see more information on a specific cryptocurrency, do `/crypto <ticker>` to show price, percentage change, and more.** \n\nPrices are updated every 60 seconds. \nLetters following the name within () are known as the ticker. \nExample: Bitcoin (BTC) - The ticker is BTC",
            color=discord.Color.gold()
        )
        for key in master_dict:
            price = master_dict[key].split(':')[1]
            embed.add_field(name = f"{key}", value = f"```${Decimal(price):,}```", inline=True)

        await interaction.response.send_message(embed=embed)


    @app_commands.command()
    @app_commands.describe(currency="Pick what cryptocurrency you want to see more information on.")
    async def crypto(
        self,
        interaction: discord.Interaction,
        currency: Literal['Bitcoin (BTC)', 'Ethereum (ETH)', 'Binance Coin (BNB)', 'Solana (SOL)',
        'Cardano (ADA)', 'XRP (XRP)', 'Polkadot (DOT)', 'Dogecoin (DOGE)', 'Avalanche (AVAX)',
        'SHIBA INU (SHIB)', 'Terra (LUNA)', 'Litecoin (LTC)', 'Uniswap (UNI)', 'Chainlink (LINK)',
        'Polygon (MATIC)', 'Algorand (ALGO)', 'Bitcoin Cash (BCH)', 'VeChain (VET)', 'Stellar (XLM)',
        'Internet Computer (ICP)']
    ):
        "Send more information on a certain cryptocurrency"
        icon_name = connect_icon_dict.get(currency)
        color = connect_color_dict.get(currency)
        market = master_dict[currency].split(':')[0]
        price = master_dict[currency].split(':')[1]
        price_change = master_dict[currency].split(':')[2]
        high = master_dict[currency].split(':')[3]
        low = master_dict[currency].split(':')[4]
        mktcap = master_dict[currency].split(':')[5]

        embed = discord.Embed(
            title=currency,
            description="Information is updated every 60 seconds",
            color=color
        )
        embed.add_field(name="Market", value = f"```{market}```")
        embed.add_field(name="Current Price", value=f"```${Decimal(price):,}```")
        embed.add_field(name="24 Hour Change", value=f"```{Decimal(price_change):,}%```")
        embed.add_field(name="24 Hour High", value=f"```${Decimal(high):,}```")
        embed.add_field(name="24 Hour Low", value=f"```${Decimal(low):,}```")
        embed.add_field(name="Market Cap", value=f"```${Decimal(mktcap):,}```")
        file = discord.File(f"./code/utils/crypto_icons/{icon_name}.png", filename=f"{icon_name}.png")
        embed.set_thumbnail(url=f"attachment://{icon_name}.png")

        await interaction.response.send_message(embed=embed, file=file)


async def setup(bot):
    await bot.add_cog(Crypto(bot))