@@ -74,6 +74,7 @@ def __init__(self):
7474 self .plugin_db = PluginDatabaseClient (self )
7575
7676 self .metadata_task = self .loop .create_task (self .metadata_loop ())
77+ self .autoupdate_task = self .loop .create_task (self .autoupdate_loop ())
7778 self ._load_extensions ()
7879
7980 @property
@@ -191,6 +192,11 @@ def run(self, *args, **kwargs):
191192 self .loop .run_until_complete (self .metadata_task )
192193 except asyncio .CancelledError :
193194 logger .debug (info ("data_task has been cancelled." ))
195+ try :
196+ self .autoupdate_task .cancel ()
197+ self .loop .run_until_complete (self .autoupdate_task )
198+ except asyncio .CancelledError :
199+ logger .debug (info ("autoupdate_task has been cancelled." ))
194200
195201 self .loop .run_until_complete (self .logout ())
196202 for task in asyncio .Task .all_tasks ():
@@ -898,6 +904,62 @@ async def validate_database_connection(self):
898904 else :
899905 logger .info (info ("Successfully connected to the database." ))
900906
907+ async def autoupdate_loop (self ):
908+ await self .wait_until_ready ()
909+
910+ if self .config .get ("disable_autoupdates" ):
911+ logger .warning (info ("Autoupdates disabled." ))
912+ logger .info (LINE )
913+ return
914+
915+ if not self .config .get ("github_access_token" ):
916+ logger .warning (info ("GitHub access token not found." ))
917+ logger .warning (info ("Autoupdates disabled." ))
918+ logger .info (LINE )
919+ return
920+
921+ logger .info (info ("Autoupdate loop started." ))
922+
923+ while not self .is_closed ():
924+ changelog = await Changelog .from_url (self )
925+ latest = changelog .latest_version
926+
927+ if parse_version (self .version ) < parse_version (latest .version ):
928+ data = await self .api .update_repository ()
929+
930+ embed = discord .Embed (color = discord .Color .green ())
931+
932+ commit_data = data ["data" ]
933+ user = data ["user" ]
934+ embed .set_author (
935+ name = user ["username" ] + " - Updating Bot" ,
936+ icon_url = user ["avatar_url" ],
937+ url = user ["url" ],
938+ )
939+
940+ embed .set_footer (
941+ text = f"Updating Modmail v{ self .version } " f"-> v{ latest .version } "
942+ )
943+
944+ embed .description = latest .description
945+ for name , value in latest .fields .items ():
946+ embed .add_field (name = name , value = value )
947+
948+ if commit_data :
949+ message = commit_data ["commit" ]["message" ]
950+ html_url = commit_data ["html_url" ]
951+ short_sha = commit_data ["sha" ][:6 ]
952+ embed .add_field (
953+ name = "Merge Commit" ,
954+ value = f"[`{ short_sha } `]({ html_url } ) "
955+ f"{ message } - { user ['username' ]} " ,
956+ )
957+ logger .info (info ("Bot has been updated." ))
958+ channel = self .log_channel
959+ await channel .send (embed = embed )
960+
961+ await asyncio .sleep (3600 )
962+
901963 async def metadata_loop (self ):
902964 await self .wait_until_ready ()
903965 if not self .guild :
0 commit comments