49 lines
1.4 KiB
JavaScript
49 lines
1.4 KiB
JavaScript
const passport = require("passport");
|
|
const { Strategy } = require("passport-discord");
|
|
const db = require("../models/user");
|
|
const config = require("../config");
|
|
passport.serializeUser(async (user, done) => {
|
|
try {
|
|
done(null, user.id);
|
|
} catch (e) {
|
|
done(null, null);
|
|
}
|
|
});
|
|
passport.deserializeUser(async (obj, done) => {
|
|
const user = await db.findOne({ id: obj });
|
|
if (user) done(null, user);
|
|
});
|
|
passport.use(
|
|
new Strategy(
|
|
{
|
|
clientID: process.env.CLIENT_ID,
|
|
clientSecret: process.env.CLIENT_SECRET,
|
|
callbackURL: process.env.CALLBACK_URL,
|
|
scope: config.scope,
|
|
},
|
|
async (accessToken, refreshToken, profile, done) => {
|
|
const { id, username, avatar } = profile;
|
|
const data = await db.findOne({ username });
|
|
if (data) {
|
|
data.accessToken = accessToken;
|
|
data.refreshToken = refreshToken;
|
|
data.username = username;
|
|
data.guilds = profile.guilds.map(g => g.id);
|
|
data.avatar = `https://cdn.discordapp.com/avatars/${id}/${avatar}`;
|
|
data.save();
|
|
done(null, data);
|
|
} else {
|
|
const ndb = {
|
|
id,
|
|
username,
|
|
avatar: `https://cdn.discordapp.com/avatars/${id}/${avatar}`,
|
|
refreshToken,
|
|
accessToken,
|
|
guilds: profile.guilds.map(g => g.id),
|
|
};
|
|
const nd = new db(ndb).save();
|
|
done(null, nd);
|
|
}
|
|
}
|
|
)
|
|
);
|