mirror of
https://github.com/Drop-OSS/drop.git
synced 2026-07-25 09:14:54 +10:00
automate twitch credential refresh
This commit is contained in:
@@ -29,6 +29,8 @@ export default defineNuxtConfig({
|
|||||||
|
|
||||||
scheduledTasks: {
|
scheduledTasks: {
|
||||||
"0 * * * *": ["cleanup:invitations"],
|
"0 * * * *": ["cleanup:invitations"],
|
||||||
|
// every two hours, check if creds need updating
|
||||||
|
"0 */2 * * *": ["metadata:refreshCredentials"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ export class IGDBProvider implements MetadataProvider {
|
|||||||
private client_id: string;
|
private client_id: string;
|
||||||
private client_secret: string;
|
private client_secret: string;
|
||||||
private access_token: string;
|
private access_token: string;
|
||||||
|
private access_token_expire: moment.Moment;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
const client_id = process.env.IGDB_CLIENT_ID;
|
const client_id = process.env.IGDB_CLIENT_ID;
|
||||||
@@ -148,6 +149,7 @@ export class IGDBProvider implements MetadataProvider {
|
|||||||
this.client_secret = client_secret;
|
this.client_secret = client_secret;
|
||||||
|
|
||||||
this.access_token = "";
|
this.access_token = "";
|
||||||
|
this.access_token_expire = moment();
|
||||||
this.authWithTwitch();
|
this.authWithTwitch();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,9 +169,17 @@ export class IGDBProvider implements MetadataProvider {
|
|||||||
console.log(inspect(response.data));
|
console.log(inspect(response.data));
|
||||||
|
|
||||||
this.access_token = response.data.access_token;
|
this.access_token = response.data.access_token;
|
||||||
// TODO: handle token expiration, time in seconds is provided, on a long running server
|
this.access_token_expire = moment().add(
|
||||||
// this WILL be an issue. Can use node timers, or maybe nuxt tasks? problem is
|
response.data.expires_in,
|
||||||
// that idk if tasks can be variable like twitch wants, expires_in is variable
|
"seconds"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async refreshCredentials() {
|
||||||
|
const futureTime = moment().add(1, "day");
|
||||||
|
|
||||||
|
// if the token expires before this future time (aka soon), refresh
|
||||||
|
if (this.access_token_expire.isBefore(futureTime)) this.authWithTwitch();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async request<T extends Object>(
|
private async request<T extends Object>(
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ export abstract class MetadataProvider {
|
|||||||
abstract fetchDeveloper(
|
abstract fetchDeveloper(
|
||||||
params: _FetchDeveloperMetadataParams
|
params: _FetchDeveloperMetadataParams
|
||||||
): Promise<DeveloperMetadata>;
|
): Promise<DeveloperMetadata>;
|
||||||
|
|
||||||
|
abstract refreshCredentials?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class MetadataHandler {
|
export class MetadataHandler {
|
||||||
@@ -253,6 +255,17 @@ export class MetadataHandler {
|
|||||||
`No metadata provider found a ${databaseName} for "${query}"`
|
`No metadata provider found a ${databaseName} for "${query}"`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh creds for all providers that need it
|
||||||
|
*/
|
||||||
|
public refreshCredentials() {
|
||||||
|
for (const provider of this.providers.values()) {
|
||||||
|
if (provider.refreshCredentials) {
|
||||||
|
provider.refreshCredentials();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const metadataHandler = new MetadataHandler();
|
export const metadataHandler = new MetadataHandler();
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { metadataHandler } from "~/server/plugins/metadata";
|
||||||
|
|
||||||
|
export default defineTask({
|
||||||
|
meta: {
|
||||||
|
name: "metadata:refreshCredentials",
|
||||||
|
description: "Refresh credentials for metadata providers",
|
||||||
|
},
|
||||||
|
run({ payload, context }) {
|
||||||
|
metadataHandler.refreshCredentials();
|
||||||
|
return { result: "Success" };
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user