Skip to content

Commit 5d8b034

Browse files
authored
Merge pull request #18 from code-chaser/codeforcesAPI
Codeforces api
2 parents dfed800 + df1aea0 commit 5d8b034

6 files changed

Lines changed: 116 additions & 157 deletions

File tree

src/bot.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,19 @@ def __init__(self, *args, **kwargs):
3535
self.load_extension(f'src.cogs.{file[:-3]}')
3636

3737
def connect_to_db(self) -> None:
38-
38+
3939
self.DB_CONNECTION = psycopg2.connect(
4040
host=os.getenv('DEX_DB_HOST'),
4141
database=os.getenv('DEX_DB_NAME'),
4242
user=os.getenv('DEX_DB_USER'),
4343
port=os.getenv('DEX_DB_PORT'),
4444
password=os.getenv('DEX_DB_PASSWORD'),
4545
)
46-
46+
4747
async def get_prefix(self, message):
4848
cur = self.DB_CONNECTION.cursor()
49-
cur.execute('SELECT prefix FROM guilds WHERE guild_id = \'' + str(message.guild.id) + '\';')
49+
cur.execute('SELECT prefix FROM guilds WHERE guild_id = \'' +
50+
str(message.guild.id) + '\';')
5051
prefix = cur.fetchone()
5152
return prefix
5253

@@ -61,7 +62,8 @@ async def on_ready(self):
6162

6263
async def on_guild_join(self, guild) -> None:
6364
cur = self.DB_CONNECTION.cursor()
64-
cur.execute('INSERT INTO guilds (guild_id,prefix,tag_messages) VALUES (\'' + str(guild.id)+'\', \'$dex \', \'on\');')
65+
cur.execute('INSERT INTO guilds (guild_id,prefix,tag_messages) VALUES (\'' +
66+
str(guild.id)+'\', \'$dex \', \'on\');')
6567
self.DB_CONNECTION.commit()
6668
cur.close()
6769
for channel in guild.text_channels:
@@ -73,18 +75,19 @@ async def on_guild_join(self, guild) -> None:
7375

7476
async def on_guild_remove(self, guild) -> None:
7577
cur = self.DB_CONNECTION.cursor()
76-
cur.execute('DELETE FROM guilds WHERE guild_id = \'' + str(guild.id) + '\';')
78+
cur.execute('DELETE FROM guilds WHERE guild_id = \'' +
79+
str(guild.id) + '\';')
7780
self.DB_CONNECTION.commit()
7881
cur.close()
7982
return
8083

8184
async def on_message(self, message) -> None:
8285
await self.process_commands(message)
8386
cur = self.DB_CONNECTION.cursor()
84-
cur.execute('SELECT tag_messages FROM guilds WHERE guild_id = \'' + str(message.guild.id) + '\';')
87+
cur.execute('SELECT tag_messages FROM guilds WHERE guild_id = \'' +
88+
str(message.guild.id) + '\';')
8589
tag_switch = cur.fetchone()
8690
cur.close()
87-
print(tag_switch[0])
8891
if tag_switch[0] == 'off':
8992
return
9093
target = message.author

src/cogs/codeforces.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import discord
2+
import aiohttp
3+
import json
4+
import os
5+
import datetime
6+
import typing
7+
from discord.ext import commands
8+
from psycopg2 import Timestamp
9+
10+
11+
class Codeforces(commands.Cog):
12+
cf_red = 0xff0000 # 2400+
13+
cf_orange = 0xff8c00 # 2200 - 2399
14+
cf_violet = 0xb200aa # 1900 - 2199
15+
cf_blue = 0x0000ff # 1600 - 1899
16+
cf_cyan = 0x03a89e # 1400 - 1599
17+
cf_green = 0x008000 # 1200 - 1399
18+
cf_gray = 0x808080 # 0 - 1199
19+
20+
def __init__(self, bot):
21+
self.bot = bot
22+
# ----------------------------------------------------------------------------------------------------------------------
23+
24+
async def get_user(self, username):
25+
API_URL = "https://codeforces.com/api/user.info?handles=" + username + ";"
26+
async with aiohttp.ClientSession() as session:
27+
async with session.get(API_URL) as resp:
28+
user_json = await resp.json()
29+
return (user_json)
30+
31+
@commands.command(name="cf-handle", aliases=["cf-user"], help="shows details of the requested codeforces handle")
32+
async def send_user(self, ctx, username):
33+
handle = await self.get_user(username)
34+
if handle["status"] == "FAILED":
35+
async with ctx.typing():
36+
embed = discord.Embed(title="Error",
37+
description=handle["comment"],
38+
colour=0xff0000,
39+
timestamp=datetime.datetime.utcnow())
40+
await ctx.send(embed=embed)
41+
return
42+
async with ctx.typing():
43+
embed = discord.Embed(title=username,
44+
description=(handle["result"][0]["firstName"] if "firstName" in handle["result"][0] else "") + " " + (
45+
handle["result"][0]["lastName"] if "lastName" in handle["result"][0] else ""),
46+
colour=self.cf_red if handle["result"][0]["maxRating"] >= 2400 else self.cf_orange if handle["result"][0]["maxRating"] >= 2200 else self.cf_violet if handle["result"][0]["maxRating"] >= 1900 else self.cf_blue if handle[
47+
"result"][0]["maxRating"] >= 1600 else self.cf_cyan if handle["result"][0]["maxRating"] >= 1400 else self.cf_green if handle["result"][0]["maxRating"] >= 1200 else self.cf_gray,
48+
timestamp=datetime.datetime.utcnow())
49+
embed.add_field(name="City", value=handle["result"][0]["city"]
50+
if "city" in handle["result"][0] else "Unknown", inline=True)
51+
embed.add_field(name="Country", value=handle["result"][0]["country"]
52+
if "country" in handle["result"][0] else "Unknown", inline=True)
53+
embed.add_field(
54+
name="Friend of", value=handle["result"][0]["friendOfCount"], inline=True)
55+
embed.add_field(name="Max Rating",
56+
value=handle["result"][0]["maxRating"], inline=True)
57+
embed.add_field(name="Max Rank",
58+
value=handle["result"][0]["maxRank"], inline=True)
59+
embed.add_field(name="Organization", value=handle["result"][0]["organization"]
60+
if handle["result"][0]["organization"] != "" else "Unknown", inline=True)
61+
embed.add_field(
62+
name="Rating", value=handle["result"][0]["rating"], inline=True)
63+
embed.add_field(
64+
name="Rank", value=handle["result"][0]["rank"], inline=True)
65+
embed.add_field(name="Last Online", value=datetime.datetime.utcfromtimestamp(
66+
handle["result"][0]["lastOnlineTimeSeconds"]).strftime('%Y-%m-%d %H:%M:%S'), inline=True)
67+
embed.set_thumbnail(url=handle["result"][0]["avatar"])
68+
await ctx.send(embed=embed)
69+
# ----------------------------------------------------------------------------------------------------------------------
70+
71+
72+
def setup(bot):
73+
bot.add_cog(Codeforces(bot))

src/cogs/fun.py

Lines changed: 0 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -55,80 +55,6 @@ async def send_nasa_pic_otd(self, ctx):
5555
await ctx.send(embed=embed)
5656
# ----------------------------------------------------------------------------------------------------------------------
5757

58-
async def get_covid19_details(self):
59-
API_URL = "https://api.covid19api.com/summary"
60-
async with aiohttp.ClientSession() as session:
61-
async with session.get(API_URL) as resp:
62-
data_json = await resp.json()
63-
return (data_json)
64-
65-
@commands.command(name="covid19", help="sends COVID-19 stats of the given country (global stats if country == null)")
66-
async def covid19_data(self, ctx, *args):
67-
countr = ""
68-
for arg in args:
69-
countr += arg + " "
70-
size = len(countr)
71-
country = countr[:size - 1]
72-
original = country
73-
found = False
74-
stats = await self.get_covid19_details()
75-
if country:
76-
for k in stats["Countries"]:
77-
if ((k["CountryCode"]).lower() == country.lower()) or ((k["Country"]).lower() == country.lower()):
78-
embed = discord.Embed(
79-
title=(k["Country"]).title(),
80-
description="COVID-19 Statistics",
81-
colour=0xff0000,
82-
timestamp=datetime.datetime.utcnow()
83-
)
84-
flag_url = "https://flagcdn.com/w640/" + \
85-
str(k["CountryCode"]).lower() + ".jpg"
86-
embed.set_thumbnail(url=flag_url)
87-
fields = [
88-
("New Confirmed Cases", k["NewConfirmed"], True),
89-
("Total Confirmed Cases", k["TotalConfirmed"], True),
90-
("Country Code", k["CountryCode"], True),
91-
("New Deaths", k["NewDeaths"], True),
92-
("Total Deaths", k["TotalDeaths"], True),
93-
("Report Time (UTC)", "Date: " +
94-
k["Date"][0:10] + " & Time: " + k["Date"][11:19], True),
95-
]
96-
for n, v, i in fields:
97-
embed.add_field(name=n, value=v, inline=i)
98-
await ctx.send(embed=embed)
99-
found = True
100-
else:
101-
k = stats["Global"]
102-
embed = discord.Embed(
103-
title="Global",
104-
description="COVID-19 Statistics",
105-
colour=0xff0000,
106-
timestamp=datetime.datetime.utcnow()
107-
)
108-
embed.set_thumbnail(
109-
url="https://user-images.githubusercontent.com/63065397/156144079-6f90504d-ad48-4f2e-bec5-bae31cebd858.png"
110-
)
111-
fields = [
112-
("New Confirmed Cases", k["NewConfirmed"], True),
113-
("Total Confirmed Cases", k["TotalConfirmed"], True),
114-
("New Deaths", k["NewDeaths"], True),
115-
("Total Deaths", k["TotalDeaths"], True),
116-
]
117-
for n, v, i in fields:
118-
embed.add_field(name=n, value=v, inline=i)
119-
await ctx.send(embed=embed)
120-
found = True
121-
if not found:
122-
embed = discord.Embed(
123-
title="Error",
124-
description="Country Not Found",
125-
colour=0xff0000
126-
)
127-
embed.add_field(name="Given Country Name",
128-
value=original, inline=True)
129-
await ctx.send(embed=embed)
130-
# ----------------------------------------------------------------------------------------------------------------------
131-
13258
async def get_meme(self):
13359
API_URL = "https://meme-api.herokuapp.com/gimme"
13460
async with aiohttp.ClientSession() as session:

src/cogs/modset.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ async def modset(self, ctx, target: Optional[Member]):
2020
@command(name="tags", aliases=["tagging", "msgtag"], help="toggles message tags")
2121
async def message_tags(self, ctx, switch: Optional[str]):
2222
cur = self.bot.DB_CONNECTION.cursor()
23-
cur.execute('SELECT tag_messages FROM guilds WHERE guild_id = \'' + str(ctx.guild.id) + '\';')
23+
cur.execute(
24+
'SELECT tag_messages FROM guilds WHERE guild_id = \'' + str(ctx.guild.id) + '\';')
2425
tag_messages = cur.fetchone()
2526
tag_switch = tag_messages[0]
2627
if switch is None:
@@ -42,7 +43,8 @@ async def message_tags(self, ctx, switch: Optional[str]):
4243
return
4344

4445
cur = self.bot.DB_CONNECTION.cursor()
45-
cur.execute('UPDATE guilds SET tag_messages = \'' + tag_switch + '\' WHERE guild_id = \'' + str(ctx.guild.id) + '\';')
46+
cur.execute('UPDATE guilds SET tag_messages = \'' + tag_switch +
47+
'\' WHERE guild_id = \'' + str(ctx.guild.id) + '\';')
4648
self.bot.DB_CONNECTION.commit()
4749
cur.close()
4850
embed = Embed(title="Status",
@@ -55,7 +57,6 @@ async def message_tags(self, ctx, switch: Optional[str]):
5557
@command(name="changepref", aliases=["changeprefix"], help="changes the prefix to the appended string")
5658
async def change_prefix(self, ctx, *args):
5759
prefix = "".join(args)
58-
prefix += ' '
5960
if ctx.guild.id == int(os.environ['PUBLIC_BOT_SERVER']):
6061
embed = Embed(title="Status",
6162
colour=0xff0000,
@@ -73,8 +74,10 @@ async def change_prefix(self, ctx, *args):
7374
await ctx.send(embed=embed)
7475
return
7576
if (prefix != "") and (len(prefix) <= 27):
77+
prefix += " "
7678
cur = self.bot.DB_CONNECTION.cursor()
77-
cur.execute("UPDATE guilds SET prefix = \'"+prefix+"\' WHERE guild_id = \'"+str(ctx.guild.id)+"\';")
79+
cur.execute("UPDATE guilds SET prefix = \'"+prefix +
80+
"\' WHERE guild_id = \'"+str(ctx.guild.id)+"\';")
7881
self.bot.DB_CONNECTION.commit()
7982
cur.close()
8083
embed = Embed(title="Status",
@@ -88,7 +91,7 @@ async def change_prefix(self, ctx, *args):
8891
colour=0xff0000,
8992
timestamp=datetime.utcnow())
9093
embed.add_field(
91-
name="Error", value="prefix length must be strictly between (0 - 28)", inline=True)
94+
name="Error", value="prefix length must be between (1 - 27)", inline=True)
9295
await ctx.send(embed=embed)
9396

9497
@command(name="goodbye!", aliases=["leaveThisServer"], help="makes the bot to leave the server (only for server owner)")
@@ -117,8 +120,9 @@ async def leave_this_server(self, ctx):
117120
await ctx.send(embed=embed)
118121
guild = ctx.guild
119122
await ctx.guild.leave()
120-
cur=self.bot.DB_CONNECTION.cursor()
121-
cur.execute("DELETE FROM guilds WHERE guild_id = \'"+str(guild.id)+"\';")
123+
cur = self.bot.DB_CONNECTION.cursor()
124+
cur.execute("DELETE FROM guilds WHERE guild_id = \'" +
125+
str(guild.id)+"\';")
122126
self.bot.DB_CONNECTION.commit()
123127
cur.close()
124128
return

0 commit comments

Comments
 (0)