|
|
|
import { Client, Player } from "spotify-api.js";
|
|
|
|
import { store } from "../store.mjs";
|
|
|
|
import { UserStore } from "../db/schemas.mjs";
|
|
|
|
|
|
|
|
export const createLocalUser = async ({ refreshToken = undefined, code = undefined }, retry = 4) => {
|
|
|
|
try {
|
|
|
|
const client = await Client.create({
|
|
|
|
refreshToken: true,
|
|
|
|
retryOnRateLimit: true,
|
|
|
|
token: {
|
|
|
|
clientID: store.clientID,
|
|
|
|
clientSecret: store.clientSecret,
|
|
|
|
redirectURL: store.redirectURL,
|
|
|
|
refreshToken,
|
|
|
|
code,
|
|
|
|
},
|
|
|
|
async onRefresh() {
|
|
|
|
await UserStore.findOneAndUpdate(
|
|
|
|
{ 'spotify.userId': client.user.id },
|
|
|
|
{ 'spotify.refreshToken': client.refreshMeta.refreshToken },
|
|
|
|
);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
const player = new Player(client);
|
|
|
|
return { client, player };
|
|
|
|
} catch (e) {
|
|
|
|
if (retry-- < 1) throw e;
|
|
|
|
if (e.response.data.status === 503) await new Promise(_ => setTimeout(_, 500));
|
|
|
|
else throw e;
|
|
|
|
return await createLocalUser({ refreshToken, code }, retry);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
export const findUserBySpotifyId = async (
|
|
|
|
{ userId, refreshToken },
|
|
|
|
{ create = false } = {},
|
|
|
|
) => {
|
|
|
|
const user = store.users.find(user => user.client.user.id === userId);
|
|
|
|
if (user) return user;
|
|
|
|
if (!create) return null;
|
|
|
|
const newUser = await createLocalUser({ refreshToken });
|
|
|
|
store.users.push(newUser);
|
|
|
|
return newUser;
|
|
|
|
}
|