import { isNumber } from 'underscore'; import { ACTIVITY_TYPE, BIND_PHONE_STATUS, PUBLIC_ACCOUNT_GIFT, PUSH_ROUTE, SDK_37_CONST, SNS_LINK_TYPE } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivityBindPhoneRewardModel } from '../../db/ActivityBindPhoneReward'; import { ActivityPublicAccountCodeModel } from '../../db/ActivityPublicAccountCode'; import { LinkModel } from '../../db/Link'; import { UserModel, UserType } from '../../db/User'; import { BindPhoneData } from '../../domain/activityField/bindPhoneField'; import { aes128Encrypt } from '../../pubUtils/util'; import { getOnlineRoleByUserCode, getRedis, getRoleCreateTime, getServerCreateTime } from '../redisService'; import { getActivityById } from './activityService'; import { sendMessageToUserWithSuc } from '../pushService'; /** * 绑定手机相关数据 * * @param {number} serverId 区Id * @param {number} activityId 活动Id * @param {string} roleId 角色Id * */ export async function getAllSnsLinkData(activityId: number, roleId: string, serverId: number, uid: number) { let activityData: ActivityModelType = await getActivityById(activityId); if(!activityData || activityData.type != ACTIVITY_TYPE.BIND_PHONE) return null; let createTime = await getRoleCreateTime(roleId); let serverTime = await getServerCreateTime(serverId); let playerData = new BindPhoneData(activityData, createTime, serverTime); let links = await LinkModel.findByServerId(serverId); playerData.setLinks(links); let user: UserType; if(playerData.bindPhone) { if(!user) user = await UserModel.findUserByUid(uid); let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid); playerData.bindPhone.setBindPhoneStatus(user, receiveRec); } if(playerData.wxPublicAccount) { if(!user) user = await UserModel.findUserByUid(uid); if(user.channelInfo) { let giftCode = encodeGiftCode(roleId, serverId, user.channelInfo.uid, user.channelInfo.platformAppid, user.channelInfo.childGameId, activityId); playerData.wxPublicAccount.setEncodeGiftCode(giftCode); let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, user.channelId); if(playerRecord) playerData.wxPublicAccount.setPlayerRecord(playerRecord); } } return playerData; } /** * 绑定手机相关数据 * * @param {number} serverId 区Id * @param {number} activityId 活动Id * @param {string} roleId 角色Id * */ export async function getBindPhoneData(activityId: number, roleId: string, serverId: number, uid: number) { let activityData: ActivityModelType = await getActivityById(activityId); if(!activityData || activityData.type != ACTIVITY_TYPE.BIND_PHONE) return null; let createTime = await getRoleCreateTime(roleId); let serverTime = await getServerCreateTime(serverId); let playerData = new BindPhoneData(activityData, createTime, serverTime); let links = await LinkModel.findByServerId(serverId); playerData.setLinks(links); let user: UserType; if(playerData.bindPhone) { if(!user) user = await UserModel.findUserByUid(uid); let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid); playerData.bindPhone.setBindPhoneStatus(user, receiveRec); } return playerData; } /** * 微信公众号 * * @param {number} serverId 区Id * @param {number} activityId 活动Id * @param {string} roleId 角色Id * */ export async function getPublicAccountData(activityId: number, roleId: string, serverId: number, user: UserType) { let activityData: ActivityModelType = await getActivityById(activityId); if(!activityData || activityData.type != ACTIVITY_TYPE.BIND_PHONE) return null; let createTime = await getRoleCreateTime(roleId); let serverTime = await getServerCreateTime(serverId); let playerData = new BindPhoneData(activityData, createTime, serverTime); let links = await LinkModel.findByServerId(serverId); playerData.setLinks(links); if(playerData.wxPublicAccount) { if(user.channelInfo) { let giftCode = encodeGiftCode(roleId, serverId, user.channelInfo.uid, user.channelInfo.platformAppid, user.channelInfo.childGameId, activityId); playerData.wxPublicAccount.setEncodeGiftCode(giftCode); let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, user.channelId); if(playerRecord) playerData.wxPublicAccount.setPlayerRecord(playerRecord); } } return playerData; } /** * 玩家玩家活动数据 * * @param {number} serverId 区Id * @param {number} activityId 活动Id * @param {string} roleId 角色Id * */ export async function getAllSnsLinkDataShow(activityId: number, roleId: string, serverId: number, uid: number) { let playerData = await getAllSnsLinkData(activityId, roleId, serverId, uid); if(playerData && playerData.canShow && playerData.canShow()) { return playerData.getShowResult(); } return null } function encodeGiftCode(roleId: string, serverId: number, uid: number, pid: string, gid: string, activityId: number) { let encodeResult = aes128Encrypt(`${roleId}|${serverId}|${uid}|${pid}|${gid}|${PUBLIC_ACCOUNT_GIFT}${activityId}|${SDK_37_CONST.GIFT_GAME_ID}`, SDK_37_CONST.PUBLIC_GIFT_KEY); return `FS${encodeResult}`; } export async function sendPublicAccountGift(message: string) { let [_activityId, userCode, channelId] = message?.split('|')||[]; let activityId = parseInt(_activityId); if(!isNumber(activityId) || !userCode || !channelId) return; let onlineRoleId = await getOnlineRoleByUserCode(userCode); // console.log('##### sendPublicAccountGift', message, userCode, onlineRoleId); if (!!onlineRoleId) { // 在线,推送消息 let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, channelId); await sendMessageToUserWithSuc(onlineRoleId, PUSH_ROUTE.PUBLIC_ACCOUNT_GIFT, { activityId, type: SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT, status: playerRecord.hasReceived? BIND_PHONE_STATUS.RECEIVED: BIND_PHONE_STATUS.HAS_BIND }); } }