增加twitter头像的返回和保存

This commit is contained in:
CounterFire2023 2024-03-28 19:36:12 +08:00
parent b49bed2bc5
commit dba4eddee7
6 changed files with 75 additions and 17 deletions

View File

@ -6,8 +6,8 @@ import { AuthRecord, PlatEnum } from 'modules/AuthRecord'
import { DiscordSvr } from 'services/discord.svr'
import { hmacsha256 } from 'utils/security.util'
const checkSign = (params: {address?: string, sign?: string}) => {
const {address, sign} = params;
const checkSign = (params: { address?: string; sign?: string }) => {
const { address, sign } = params
if (!address || !sign) {
throw new ZError(10, 'invalid params')
}
@ -44,6 +44,7 @@ class MainController extends BaseController {
result.twitter = {
id: record.openId,
username: record.username,
avatar: record.avatar,
}
break
case 7:
@ -85,30 +86,30 @@ class MainController extends BaseController {
return { verified }
}
@role(ROLE_ANON)
@router('get /activity/twitter/:address')
async checkTwitterFollow(req) {
let { address } = req.params
checkSign(req.params);
checkSign(req.params)
address = address.toLowerCase()
let record = await AuthRecord.findOne({ address, platform: PlatEnum.TWITTER })
let result: any = { }
let result: any = {}
if (!!record) {
result.username = record.username
result.userid = record.openId
result.avatar = record.avatar
}
return result
}
}
@role(ROLE_ANON)
@router('get /activity/discord/:address')
async checkDiscord(req) {
let { address } = req.params
checkSign(req.params);
checkSign(req.params)
address = address.toLowerCase()
let record = await AuthRecord.findOne({ address, platform: PlatEnum.DISCORD })
let result: any = { }
let result: any = {}
if (!!record) {
result.verified = record.condition
result.username = record.username
@ -122,17 +123,17 @@ class MainController extends BaseController {
@router('get /activity/discord/svr/:id')
async checkDiscordJoin(req) {
let { id } = req.params
checkSign(req.params);
checkSign(req.params)
let verified = new DiscordSvr().checkUser(id)
return {verified}
return { verified }
}
@role(ROLE_ANON)
@router('get /activity/discord/role/:id')
async checkDiscordRole(req) {
let { id } = req.params
checkSign(req.params);
checkSign(req.params)
let verified = new DiscordSvr().checkUserRole(id)
return {verified}
return { verified }
}
}

View File

@ -1,9 +1,7 @@
import BaseController, { ROLE_ANON } from 'common/base.controller'
import { role, router } from 'decorators/router'
class OauthController extends BaseController {
@role(ROLE_ANON)
@router('get /oauth/redirect')
@router('post /oauth/redirect')

View File

@ -34,6 +34,9 @@ class TwitterController extends BaseController {
record.nickname = uinfo.data?.name
record.username = uinfo.data?.username
record.openId = uinfo.data?.id
if (uinfo.data?.profile_image_url) {
record.avatar = uinfo.data?.profile_image_url.replace('_normal', '')
}
await record.save()
}
if (stateArr.length > 2) {

View File

@ -32,6 +32,8 @@ export class AuthRecordClass extends BaseModule {
@prop()
public username?: string
@prop()
public avatar?: string
// 对应discord上的discriminator
@prop()
public discriminator?: string

View File

@ -45,10 +45,32 @@ export class DiscordSvr {
private guild: Guild
public async init() {
console.log('DiscordSvr init')
this.client = new Client({ intents: [GatewayIntentBits.Guilds] })
this.client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers] })
this.client.once(Events.ClientReady, async c => {
console.log(`Ready! Logged in as ${c.user.tag}`)
this.guild = await this.client.guilds.fetch(process.env.DISCROD_GUILD_ID)
console.log('guild', this.guild)
await this.guild.members.fetch()
for (const member of this.guild.members.cache.values()) {
console.log(member.user)
}
})
this.client.on(Events.GuildMemberUpdate, async (oldMember, newMember) => {
console.log('GuildMemberUpdate', oldMember, newMember)
// Check if the member's roles have changed
// if (oldMember.roles.cache.size !== newMember.roles.cache.size) {
// // Get the added and removed roles
// const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id))
// const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id))
// console.log('addedRoles', addedRoles)
// console.log('removedRoles', removedRoles)
// }
})
this.client.on(Events.GuildMemberAdd, async member => {
console.log('GuildMemberAdd', member)
})
this.client.on(Events.GuildMemberRemove, async member => {
console.log('GuildMemberRemove', member)
})
this.client.login(process.env.DISCORD_BOT_TOKEN)
}
@ -66,10 +88,13 @@ export class DiscordSvr {
if (!this.guild) {
throw new ZError(10, 'DiscordSvr not init')
}
for (const member of this.guild.members.cache.values()) {
console.log(member.user)
}
return this.guild.members.cache.has(uid)
}
public async checkUserRole(uid: string) {
public checkUserRole(uid: string) {
if (!this.guild) {
throw new ZError(10, 'DiscordSvr not init')
}

View File

@ -22,8 +22,37 @@ export async function exchangeTwitterCodeForToken(code: string, vcode: string) {
return data
}
/**
* https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code
* @param refreshToken
* @returns
*/
export async function refreshToken(refreshToken: string) {
const url = 'https://api.twitter.com/2/oauth2/token'
const credentials = Buffer.from(`${consumerKey}:${consumerSecret}`).toString('base64')
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: `Basic ${credentials}`,
},
body: new URLSearchParams({
grant_type: 'refresh_token',
refresh_token: refreshToken,
}),
})
const data = await response.json()
return data
}
/**
* https://developer.twitter.com/en/docs/twitter-api/users/lookup/api-reference/get-users-me
* User rate limit (User context): 75 requests per 15-minute window per each authenticated user
* @param accessToken
* @returns
*/
export async function getTwitterUserInfo(accessToken: string) {
const url = 'https://api.twitter.com/2/users/me'
const url = 'https://api.twitter.com/2/users/me?user.fields=profile_image_url'
const response = await fetch(url, {
method: 'GET',
headers: {