-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDiscordBot.py
198 lines (168 loc) · 8.61 KB
/
DiscordBot.py
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import discord
import time
from discord.ext import tasks,commands
import os
from dotenv import load_dotenv
from JobPostingFetcher import JobPostingFetcher
from DataFrameAccessor import DataFrameAccessor
from LoggingService import LoggingService
from TextFormattingHandler import TextFormattingHandler
from JobScrapingService import JobScrapingService
# Setup Bot
load_dotenv()
TOKEN = os.getenv("TOKEN")
URI = os.getenv("MONGODB_URI")
CHANNEL_1 = int(os.getenv("CHANNEL_ID_1"))
CHANNEL_2 = int(os.getenv("CHANNEL_ID_2")) # CAN BE REMOVED WICS 2024-2025
client = commands.Bot(command_prefix="$",intents=discord.Intents.default())
# Create instances for postings
logger = LoggingService(URI)
data_accessor = DataFrameAccessor(logger)
formatter = TextFormattingHandler()
data_scraper = JobScrapingService(logger)
job_fetcher = JobPostingFetcher(formatter,data_scraper,data_accessor)
# Define icons for different types of roles
newgrad_icon = "https://cdn-icons-png.flaticon.com/128/1991/1991047.png"
internship_icon = "https://cdn-icons-png.flaticon.com/128/7376/7376577.png"
offseason_icon = "https://cdn-icons-png.flaticon.com/128/2117/2117739.png"
@client.event
async def on_ready():
print(f'{client.user} has connected to Discord!')
logger.log_startup()
# Start tasks for sending roles
try:
send_new_grad_roles.start()
except Exception as ex:
logger.log_task_start_exception("TASK START EXCEPTION: New grad roles",ex)
try:
send_summer_roles.start()
except Exception as ex:
logger.log_task_start_exception("TASK START EXCEPTION: Summer roles",ex)
try:
send_offseason_roles.start()
except Exception as ex:
logger.log_task_start_exception("TASK START EXCEPTION: Offseason roles",ex)
@tasks.loop(hours=24)
async def send_new_grad_roles():
# This function runs every 24 hours and sends new grad roles
logger.check_space()
job_channel = client.get_channel(CHANNEL_1)
plugs = client.get_channel(CHANNEL_2)
df_posting = job_fetcher.latest_newgrad_postings()
newgrad_color = 0xf2f0ff
try:
for i, row in df_posting.iterrows():
data = row
hash_id=data_accessor.create_id("newgrad", data)
doc_exist = logger.update_postings_db(data,hash_id)
if doc_exist is not None: data = doc_exist
company = data_accessor.get_company_text(data)
role = data_accessor.get_role(data)
date_posted =data_accessor.get_date_posted(data)
locations = data_accessor.get_locations(data)
link = data_accessor.get_application_link(data)
logger.log_posting(data,f"Posting New Grad role for {company}: {role}")
if logger.check_shared_status(hash_id):
logger.log_catch_duplicate(data,f"> {company}: {role} was already posted today.\n")
continue
else:
embed=discord.Embed(description="New Grad", title=company, color=newgrad_color)
embed.set_thumbnail(url=newgrad_icon)
embed.add_field(name="Role", value=role, inline=True)
embed.add_field(name="Date Posted", value=date_posted, inline=True)
embed.add_field(name="Location", value=locations, inline=False)
embed.add_field(name="Application Link", value=link, inline=False)
embed.set_footer(text="Resume icons created by juicy_fish - Flaticon")
try:
await job_channel.send(embed=embed)
await plugs.send(embed=embed)
logger.set_sucessful_shared_status(hash_id)
except Exception as ex:
logger.set_failed_shared_status(hash_id)
logger.log_post_failure(data,f"New grad role {company} failed to send",str(ex))
time.sleep(5)
except(AttributeError) as err:
logger.log_task_exception("TASK ERROR: While sending New Grad roles",err)
return
@tasks.loop(hours=24)
async def send_summer_roles():
# This function runs every 24 hours and sends summer roles
logger.check_space()
job_channel = client.get_channel(CHANNEL_1)
df_posting = job_fetcher.latest_internship_postings()
summer_color = 0xd1c171
try:
for i, row in df_posting.iterrows():
data = row
hash_id=data_accessor.create_id("internship",data)
doc_exist = logger.update_postings_db(data,hash_id)
if doc_exist is not None: data = doc_exist
company = data_accessor.get_company_text(data)
role = data_accessor.get_role(data)
date_posted =data_accessor.get_date_posted(data)
locations = data_accessor.get_locations(data)
link = data_accessor.get_application_link(data)
logger.log_posting(data,f"Posting Summer role for {company}: {role}")
if logger.check_shared_status(hash_id):
logger.log_catch_duplicate(data,f"> {company}: {role} was already posted today.\n")
continue
else:
embed=discord.Embed(description="Summer Internship", title=company, color=summer_color)
embed.set_thumbnail(url=internship_icon)
embed.add_field(name="Role", value=role, inline=True)
embed.add_field(name="Date Posted", value=date_posted, inline=True)
embed.add_field(name="Location", value=locations, inline=False)
embed.add_field(name="Application Link", value=link, inline=False)
embed.set_footer(text="Resume icons created by juicy_fish - Flaticon")
try:
await job_channel.send(embed=embed)
logger.set_sucessful_shared_status(hash_id)
except Exception as ex:
logger.set_failed_shared_status(hash_id)
logger.log_post_failure(data,f"Summer role {company} failed to send",str(ex))
time.sleep(5)
except(AttributeError) as err:
logger.log_task_exception("TASK ERROR: While sending summer roles",err)
return
@tasks.loop(hours=24)
async def send_offseason_roles():
# This function runs every 24 hours and sends offseason roles
logger.check_space()
job_channel = client.get_channel(CHANNEL_1)
df_posting = job_fetcher.latest_offseason_postings()
offseason_color = 0x71b4d1
try:
for i, row in df_posting.iterrows():
data = row
hash_id=data_accessor.create_id("offseason",data)
doc_exist = logger.update_postings_db(data,hash_id)
if doc_exist is not None: data = doc_exist
company = data_accessor.get_company_text(data)
role = data_accessor.get_role(data)
date_posted =data_accessor.get_date_posted(data)
locations = data_accessor.get_locations(data)
link = data_accessor.get_application_link(data)
logger.log_posting(data,f"Posting Offseason role for {company}: {role}")
if logger.check_shared_status(hash_id):
logger.log_catch_duplicate(data,f"> {company}: {role} was already posted today.\n")
continue
else:
embed=discord.Embed(description="Offseason Internship", title=company, color=offseason_color)
embed.set_thumbnail(url=offseason_icon)
embed.add_field(name="Role", value=role, inline=True)
embed.add_field(name="Date Posted", value=date_posted, inline=True)
embed.add_field(name="Term(s)", value=data_accessor.get_terms(row), inline=False)
embed.add_field(name="Location", value=locations, inline=False)
embed.add_field(name="Application Link", value=link, inline=False)
embed.set_footer(text="Resume icons created by juicy_fish - Flaticon")
try:
await job_channel.send(embed=embed)
logger.set_sucessful_shared_status(hash_id)
except Exception as ex:
logger.set_failed_shared_status(hash_id)
logger.log_post_failure(data,f"Offseason role {company} failed to send",str(ex))
time.sleep(5)
except(AttributeError) as err:
logger.log_task_exception("TASK ERROR: While sending Offseason roles",err)
return
client.run(TOKEN) #runs the bot with the login token from the .env file