Skip to content

Commit a90a89c

Browse files
author
Michael Miele-Herndon
committed
Update main.py
1 parent 37ff81d commit a90a89c

File tree

1 file changed

+106
-80
lines changed

1 file changed

+106
-80
lines changed

src/main.py

Lines changed: 106 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,18 @@
1515
from discord.errors import NotFound
1616
from googletrans import Translator
1717

18-
translator = Translator()
18+
SHARD_ID = 0
19+
TOTAL_SHARDS = 1
1920

20-
try:
21-
guild_ids = CACHE.guild_ids
22-
except:
23-
guild_ids = []
21+
translator = Translator()
2422

2523
DISCORD_TOKEN = CACHE.DISCORD_TOKEN
2624
TWITCH_ID = CACHE.TWITCH_ID
2725
TWITCH_SECRET = CACHE.TWITCH_SECRET
28-
CACHE_HEADER = "DISCORD_TOKEN = \'" + DISCORD_TOKEN + "\'\nTWITCH_ID = \'" + TWITCH_ID + \
29-
"\'\nTWITCH_SECRET = \'" + TWITCH_SECRET + "\'\nprefix = \'" + CACHE.prefix \
30-
+ "\'\nname = \'" + CACHE.name + "\'\ndesc = \'" + CACHE.desc + "\'\nguild_ids = " \
31-
+ str(guild_ids) + "\ndata = "
3226

3327
intent = discord.Intents.default()
3428
intent.members = True
35-
CLIENT = commands.Bot(command_prefix=CACHE.prefix, intents=intent)
29+
CLIENT = commands.AutoShardedBot(command_prefix=CACHE.prefix, intents=intent, shard_ids=[SHARD_ID], shard_count=TOTAL_SHARDS)
3630

3731

3832
@CLIENT.event
@@ -195,9 +189,9 @@ def __init__(self, data, i):
195189
def __init__(self):
196190
self.data = CACHE.data
197191
self.server_objects = []
198-
self.reload_objects(self.data, 0)
192+
self.reload_objects(self.data)
199193

200-
def reload_objects(self, newdata, write=1):
194+
def reload_objects(self, newdata):
201195
"""Sets self.data to newdata, reloads server objects with newdata, and writes updated data to file"""
202196
newdata = ast.literal_eval(str(newdata))
203197
self.data = newdata
@@ -206,16 +200,6 @@ def reload_objects(self, newdata, write=1):
206200
# recreate server object list to match changed cache file -
207201
# iterate through cache file, each server in it is sent to self.Server constructor that
208202
# creates a new object with that server's attributes. The object is added to self.server_objects
209-
if write == 1:
210-
w = False
211-
while not w:
212-
try:
213-
with open("cache.py", "wb") as cfile:
214-
cfile.write((CACHE_HEADER + str(newdata)).encode('utf8'))
215-
w = True
216-
except:
217-
print("error writing")
218-
print(traceback.format_exc())
219203

220204
@staticmethod
221205
def get_obdated_obj_followed(serverid):
@@ -337,7 +321,8 @@ def get_broadcaster_clips(self, broadcaster_id, limit=1, started_at=""):
337321
start = "&started_at="
338322
h = {'Client-ID': self.CLIENT_ID, 'client_secret': self.CLIENT_SECRET, 'Authorization': "Bearer " + self.oauth}
339323
a = requests.get(
340-
url='https://api.twitch.tv/helix/clips?broadcaster_id=' + str(broadcaster_id) + '&first=' + str(limit) + start + str(started_at), headers=h)
324+
url='https://api.twitch.tv/helix/clips?broadcaster_id=' + str(broadcaster_id) + '&first=' + str(
325+
limit) + start + str(started_at), headers=h)
341326
return a.json()
342327

343328
def get_game_name(self, game_id):
@@ -386,7 +371,9 @@ def get_most_recent_vid(self, user_query):
386371
try:
387372
for u in a.json()['data']:
388373
if str(u['display_name']).lower() == str(user_query).lower():
389-
res = requests.get('https://api.twitch.tv/helix/videos?user_id=' + u['id'] + "&sort=time", headers=h).json()
374+
res = requests.get('https://api.twitch.tv/helix/videos?user_id=' + u['id'] + "&sort=time",
375+
headers=h).json()
376+
# print(res)
390377
return res['data'][0]['url']
391378
except IndexError:
392379
raise Exception("novids")
@@ -478,34 +465,30 @@ async def set_watching_activity(self, activity):
478465
self.activity = activity
479466

480467
def has_role(self, serverid, userid, roleid):
481-
guild = self.client.get_guild(int(serverid))
482-
user = guild.get_member(userid)
483-
print(user)
468+
user = self.get_member(serverid, userid)
484469
for r in user.roles:
485-
print(r)
486470
if r.id == roleid:
487471
return True
488472
return False
489473

474+
@staticmethod
475+
def get_member(serverid, userid):
476+
for m in CLIENT.get_guild(int(serverid)).members:
477+
if int(m.id) == int(userid):
478+
return m
479+
return None
480+
490481
async def give_role(self, serverid, userid, roleid):
491482
guild = self.client.get_guild(int(serverid))
492-
user = guild.get_member(userid)
483+
user = self.get_member(serverid, userid)
493484
role = guild.get_role(roleid)
494-
try:
495-
if user is None:
496-
print(type(userid))
497-
await user.add_roles(role)
498-
except discord.errors.Forbidden:
499-
pass
485+
await user.add_roles(role)
500486

501487
async def remove_role(self, serverid, userid, roleid):
502488
guild = self.client.get_guild(int(serverid))
503-
user = guild.get_member(userid)
489+
user = self.get_member(serverid, userid)
504490
role = guild.get_role(roleid)
505-
try:
506-
await user.remove_roles(role)
507-
except discord.errors.Forbidden:
508-
pass
491+
await user.remove_roles(role)
509492

510493
@staticmethod
511494
def get_msg_secs_active(msg):
@@ -535,6 +518,9 @@ async def on_ready():
535518
print("logged in as")
536519
print("username: " + str(CLIENT.user.name))
537520
print("client id: " + str(DISCORD_TOKEN))
521+
print("total shards: " + str(CLIENT.shard_count))
522+
print("Running as shard: " + str(SHARD_ID))
523+
print("shard guilds: " + str(len(CLIENT.guilds)))
538524
print("----------")
539525
else:
540526
print("ALREADY STARTED")
@@ -577,8 +563,16 @@ async def server_background(s):
577563
live_user = ulist[i]
578564
old_stat = s.followed[i][1]
579565
if stats[i] == "True" and old_stat == "False": # if new status = True and old status = False
566+
send_bool = True
580567
t_user = twitch.find_user(live_user)
581568
dta = twitch.get_streams(live_user)
569+
original_starttime = datetime.datetime.fromisoformat(t_user.started_at[:-1]).timestamp()
570+
curr_time = datetime.datetime.utcnow().timestamp()
571+
print(curr_time - original_starttime)
572+
if curr_time - original_starttime > 1800:
573+
# theres a bug where sometimes live msgs will be repeated
574+
# if 30 mins have passed since the user was recorded going live by twitch, assume we've already sent a msg
575+
send_bool = False
582576
try:
583577
viewers = str(dta['viewer_count'])
584578
except:
@@ -606,12 +600,16 @@ async def server_background(s):
606600
post_ch = int(take_off_brackets(str(s.settings['post_channels'][ind][1])))
607601
else:
608602
post_ch = int(take_off_brackets(str(s.settings['post_channels'][0][1])))
609-
sent_msg = await client_send(CLIENT.get_channel(post_ch), message, 0)
603+
if send_bool:
604+
try:
605+
sent_msg = await client_send(CLIENT.get_channel(post_ch), message, 0)
606+
except:
607+
print("send msg:", traceback.format_exc())
608+
print(datetime.datetime.now(), s.name, s.id, ":\n", message, "\nsent_msg:", sent_msg)
610609
try:
611610
prev_times[i] = round(time.time())
612611
except:
613612
print(traceback.format_exc())
614-
print(datetime.datetime.now(), s.name, s.id, ":\n", message, "\n")
615613
except Exception as e:
616614
if str(s.settings['post_channels'][0][1]) == "":
617615
print("\n", s.name, s.id, "- couldn't send live message (no channel set)")
@@ -697,17 +695,22 @@ async def server_background(s):
697695
d_usrs, t_usrs, rls = s.settings['d'], s.settings['t'], s.settings['r']
698696
livedata = twitch.check_live(t_usrs)
699697
for i in range(len(livedata)):
700-
findex = ulist.index(t_usrs[i])
701-
if livedata[i] == "True":
702-
if s.followed[findex][6] == 0:
703-
await dis.give_role(s.id, d_usrs[i], rls[0])
704-
s.followed[findex][6] = 1
705-
else:
706-
if s.followed[findex][6] == 1:
707-
await dis.remove_role(s.id, d_usrs[i], rls[0])
708-
s.followed[findex][6] = 0
709-
except ValueError:
710-
pass
698+
if t_usrs[i] in ulist:
699+
findex = ulist.index(t_usrs[i])
700+
if livedata[i] == "True":
701+
if s.followed[findex][6] == 0:
702+
try:
703+
await dis.give_role(s.id, d_usrs[i], rls[0])
704+
except:
705+
pass
706+
s.followed[findex][6] = 1 # this keeps track of if the role was added already
707+
else:
708+
if s.followed[findex][6] == 1:
709+
try:
710+
await dis.remove_role(s.id, d_usrs[i], rls[0])
711+
except:
712+
pass
713+
s.followed[findex][6] = 0
711714
except:
712715
print(s.id, s.name, "d_t connections:", traceback.format_exc())
713716

@@ -720,13 +723,19 @@ async def server_background(s):
720723
if stitle != "":
721724
if user.title != stitle and s.followed[i][1] == "True" and str(user.title) != "None": # title change alerts
722725
post_ch = int(take_off_brackets(str(s.settings['post_channels'][0][1])))
723-
if "2" in str(s.muted):
724-
print("old title:" + stitle, "\nnew title:", user.title)
725-
tm = await client_send(CLIENT.get_channel(post_ch), str(s.followed[i][0]) + " " + translate("has changed their title to", s.lang) + " **" + str(user.title) + "**", 0)
726-
delete_queue.append([tm, time.time()])
726+
try:
727+
if "2" in str(s.muted):
728+
print("old title:" + stitle, "\nnew title:", user.title)
729+
tm = await client_send(CLIENT.get_channel(post_ch), str(s.followed[i][0]) + " " + translate("has changed their title to", s.lang) + " **" + str(user.title) + "**", 0)
730+
delete_queue.append([tm, time.time()])
731+
except:
732+
pass
727733
if "3" in str(s.muted):
728734
# make it so it edits title in original alert
729-
ms = await CLIENT.get_channel(int(take_off_brackets(str(s.settings['post_channels'][0][1])))).fetch_message(s.followed[i][2])
735+
try:
736+
ms = await CLIENT.get_channel(int(take_off_brackets(str(s.settings['post_channels'][0][1])))).fetch_message(s.followed[i][2])
737+
except:
738+
pass
730739
live_user = s.followed[i][0]
731740
title = user.title
732741
game = twitch.get_game_name(user.game_id)
@@ -739,7 +748,10 @@ async def server_background(s):
739748
message = str(parse_live_msg(str(live_user), str(s.live_message), title, game, viewers, s.settings, mention_users=True, server=s))
740749
else:
741750
message = str(parse_live_msg(str(live_user), str(s.live_message), title, game, viewers, s.settings, mention_users=False, server=s))
742-
await ms.edit(content=message)
751+
try:
752+
await ms.edit(content=message)
753+
except:
754+
pass
743755
except:
744756
print(s.id, s.name, "titles:", traceback.format_exc())
745757

@@ -753,24 +765,30 @@ async def server_background(s):
753765
if "9" in str(s.muted):
754766
old_game = twitch.get_game_name(sgame)
755767
print("old game:" + old_game, "\nnew game:" + curr_game_name)
756-
tg = await client_send(CLIENT.get_channel(post_ch), str(s.followed[i][0]) + " " + translate("is now playing", s.lang) + " **" + curr_game_name + "**", 0)
757-
delete_queue.append([tg, time.time()])
758-
if "3" in str(s.muted):
759-
# make it so it edits title in original alert
760-
ms = await CLIENT.get_channel(int(take_off_brackets(str(s.settings['post_channels'][0][1])))).fetch_message(s.followed[i][2])
761-
live_user = s.followed[i][0]
762-
title = user.title
763-
game = twitch.get_game_name(user.game_id)
764-
dta = twitch.get_streams(live_user)
765768
try:
766-
viewers = str(dta['viewer_count'])
769+
tg = await client_send(CLIENT.get_channel(post_ch), str(s.followed[i][0]) + " " + translate("is now playing", s.lang) + " **" + curr_game_name + "**", 0)
770+
delete_queue.append([tg, time.time()])
767771
except:
768-
viewers = "0"
769-
if "7" in str(s.muted):
770-
message = str(parse_live_msg(str(live_user), str(s.live_message), title, game, viewers, s.settings, mention_users=True, server=s))
771-
else:
772-
message = str(parse_live_msg(str(live_user), str(s.live_message), title, game, viewers, s.settings, mention_users=False, server=s))
773-
await ms.edit(content=message)
772+
pass
773+
try:
774+
if "3" in str(s.muted):
775+
# make it so it edits title in original alert
776+
ms = await CLIENT.get_channel(int(take_off_brackets(str(s.settings['post_channels'][0][1])))).fetch_message(s.followed[i][2])
777+
live_user = s.followed[i][0]
778+
title = user.title
779+
game = twitch.get_game_name(user.game_id)
780+
dta = twitch.get_streams(live_user)
781+
try:
782+
viewers = str(dta['viewer_count'])
783+
except:
784+
viewers = "0"
785+
if "7" in str(s.muted):
786+
message = str(parse_live_msg(str(live_user), str(s.live_message), title, game, viewers, s.settings, mention_users=True, server=s))
787+
else:
788+
message = str(parse_live_msg(str(live_user), str(s.live_message), title, game, viewers, s.settings, mention_users=False, server=s))
789+
await ms.edit(content=message)
790+
except:
791+
pass
774792
except:
775793
print(s.id, s.name, "games:", traceback.format_exc())
776794

@@ -811,24 +829,32 @@ async def server_background(s):
811829
async def main():
812830
cache.reload_objects_nolive()
813831
try:
814-
# make sure the twitch oauth key is still valid
815-
user = twitch.find_user('esl_csgo')
832+
user = twitch.find_user('hesmen')
816833
if user is None:
817-
# if not, reset it
834+
print("resetting twitch oauth")
818835
twitch.set_oauth()
819836
procs = []
820837
for s in cache.server_objects:
821-
procs.append(asyncio.create_task(server_background(s)))
838+
gg = CLIENT.get_guild(int(s.id))
839+
if gg is not None:
840+
s = cache.binary_search_object_by_id(gg.id)
841+
procs.append(asyncio.create_task(server_background(s)))
842+
822843
for p in procs:
823844
try:
824845
await p
825846
except:
826847
print(traceback.format_exc())
848+
827849
global delete_queue
828850
for m in delete_queue:
829851
if time.time() - m[1] > 300:
830852
delete_queue.remove(m)
831-
await m[0].delete()
853+
try:
854+
print("deleting", m[0].content)
855+
await m[0].delete()
856+
except:
857+
pass
832858
except:
833859
print(traceback.format_exc())
834860

0 commit comments

Comments
 (0)