@@ -11,11 +11,17 @@ import "package:codercord/discord/interactions/multiselects/multiselects.dart"
1111
1212import "package:logging/logging.dart" ;
1313
14+ import "package:codercord/github/github.dart" ;
15+ import "package:github/github.dart" ;
16+ import "package:version/version.dart" ;
17+
1418import "package:nyxx/nyxx.dart" ;
1519import "package:nyxx_interactions/nyxx_interactions.dart" ;
1620
1721final logger = Logger ("Codercord" );
1822
23+ RegExp linkText = RegExp ("(?<=\\ [)(.+)(?=\\ ])" );
24+
1925class Codercord {
2026 final List <PresenceBuilder > presenceList = [
2127 PresenceBuilder .of (activity: ActivityBuilder .game ("with Coder OSS" )),
@@ -57,6 +63,50 @@ class Codercord {
5763 interactions.syncOnReady ();
5864 }
5965
66+ Future <List <Release >> triggerReleaseCheck (RepositorySlug slug) async {
67+ Version ? lastSentVersion;
68+
69+ await for (final message in releaseChannel.downloadMessages (limit: 10 )) {
70+ if (message.author.id == client.self.id && message.embeds.isNotEmpty) {
71+ IEmbedField versionField = message.embeds[0 ].fields.firstWhere (
72+ (field) => field.name == "Version" ,
73+ );
74+
75+ String ? messageVersion =
76+ linkText.stringMatch (versionField.content)? .replaceFirst ("v" , "" );
77+
78+ try {
79+ lastSentVersion = Version .parse (messageVersion! );
80+
81+ break ;
82+ } catch (_) {}
83+ }
84+ }
85+
86+ List <Release > releasesToSend;
87+ if (lastSentVersion != null ) {
88+ releasesToSend = await getNewerReleases (slug, lastSentVersion).then (
89+ (releases) => releases.reversed.toList (),
90+ );
91+ } else {
92+ releasesToSend = [await getNewestRelease (slug)];
93+ }
94+
95+ for (final release in releasesToSend) {
96+ ComponentMessageBuilder releaseMessage = await makeReleaseMessage (
97+ slug,
98+ release,
99+ );
100+
101+ await releaseChannel.sendMessage (releaseMessage);
102+ logger.info (
103+ "Sent release announcement for ${slug .fullName } ${release .tagName !}" ,
104+ );
105+ }
106+
107+ return releasesToSend;
108+ }
109+
60110 void login () async {
61111 logger.info ("Codercord is loading.." );
62112
@@ -76,15 +126,18 @@ class Codercord {
76126 exit (1 );
77127 }
78128
79- logger.info ("Registering commands.." );
80- await registerInteractionHandlers ();
81-
82129 logger.info ("Codercord is ready !" );
83130
84131 logger.info (
85132 "Invite link: https://discord.com/oauth2/authorize?client_id=$clientId &scope=bot%20applications.commands&permissions=294205377552" ,
86133 );
87134
135+ logger.info ("Registering commands.." );
136+ await registerInteractionHandlers ();
137+
138+ logger.info ("Checking for new releases.." );
139+ await triggerReleaseCheck (coderRepo);
140+
88141 client.eventsWs.onThreadCreated.listen ((event) async {
89142 if (event.newlyCreated && await event.thread.isHelpPost) {
90143 event.thread.setPostTags ([openedTagID]);
@@ -112,6 +165,12 @@ class Codercord {
112165 await event.message.delete (
113166 auditReason: "Automatic deletion of channel pin announcements." ,
114167 );
168+ } else if (event.message.channel.id == releaseAlertChannel.id &&
169+ event.message.author.isInteractionWebhook) {
170+ logger.info (
171+ "A new message was sent in the release alert channel, checking for new releases.." ,
172+ );
173+ await triggerReleaseCheck (coderRepo);
115174 }
116175 });
117176
0 commit comments