@@ -154,3 +154,95 @@ export async function getLatestFirebotReleaseVersion(): Promise<string | null> {
154154
155155 return null ;
156156}
157+
158+ export async function getRecentFirebotReleases ( ) : Promise < IRelease [ ] | null > {
159+ const getReleasesUrl =
160+ 'https://api.github.com/repos/crowbartools/firebot/releases?per_page=50' ;
161+
162+ let response : AxiosResponse < IRelease [ ] > ;
163+ try {
164+ response = await axios . get < IRelease [ ] > (
165+ getReleasesUrl ,
166+ getDefaultAxiosConfig ( )
167+ ) ;
168+ } catch ( error ) {
169+ console . log ( 'Error getting firebot releases' , error ) ;
170+ }
171+
172+ if ( response && response . status == 200 ) {
173+ return response . data ;
174+ }
175+
176+ return null ;
177+ }
178+
179+ export interface SupportedVersions {
180+ currentStable : string | null ;
181+ previousStable : string | null ;
182+ previousStableExpiresAt : number | null ;
183+ prerelease : string | null ;
184+ }
185+
186+ export async function getSupportedFirebotVersions ( ) : Promise < SupportedVersions > {
187+ const releases = await getRecentFirebotReleases ( ) ;
188+
189+ const result : SupportedVersions = {
190+ currentStable : null ,
191+ previousStable : null ,
192+ previousStableExpiresAt : null ,
193+ prerelease : null ,
194+ } ;
195+
196+ if ( ! releases || releases . length === 0 ) {
197+ return result ;
198+ }
199+
200+ // Find stable releases
201+ const stableReleases = releases . filter (
202+ ( r ) => ! r . prerelease
203+ ) ;
204+
205+ // Find prerelease versions (betas, etc)
206+ const prereleases = releases . filter (
207+ ( r ) => r . prerelease
208+ ) ;
209+
210+ // Current stable is the most recent stable release
211+ if ( stableReleases . length > 0 ) {
212+ result . currentStable = stableReleases [ 0 ] . tag_name ;
213+
214+ // Check if previous stable should still be supported (within 30 days of current stable release)
215+ if ( stableReleases . length > 1 ) {
216+ const currentStableDate = new Date ( stableReleases [ 0 ] . published_at ) ;
217+ const now = new Date ( ) ;
218+ const daysSinceCurrentStable = Math . floor (
219+ ( now . getTime ( ) - currentStableDate . getTime ( ) ) / ( 1000 * 60 * 60 * 24 )
220+ ) ;
221+
222+ if ( daysSinceCurrentStable <= 30 ) {
223+ result . previousStable = stableReleases [ 1 ] . tag_name ;
224+ // Calculate expiration date (30 days from current stable release)
225+ const expirationDate = new Date ( currentStableDate . getTime ( ) + 30 * 24 * 60 * 60 * 1000 ) ;
226+ result . previousStableExpiresAt = Math . floor ( expirationDate . getTime ( ) / 1000 ) ;
227+ }
228+ }
229+ }
230+
231+ // Check if there's a prerelease that hasn't been superseded by a stable
232+ // A prerelease is still supported if it's newer than the current stable
233+ if ( prereleases . length > 0 && stableReleases . length > 0 ) {
234+ const latestPrerelease = prereleases [ 0 ] ;
235+ const latestPrereleaseDate = new Date ( latestPrerelease . published_at ) ;
236+ const currentStableDate = new Date ( stableReleases [ 0 ] . published_at ) ;
237+
238+ // Prerelease is supported if it was released after the current stable
239+ if ( latestPrereleaseDate > currentStableDate ) {
240+ result . prerelease = latestPrerelease . tag_name ;
241+ }
242+ } else if ( prereleases . length > 0 && stableReleases . length === 0 ) {
243+ // No stable releases, so the prerelease is supported
244+ result . prerelease = prereleases [ 0 ] . tag_name ;
245+ }
246+
247+ return result ;
248+ }
0 commit comments