This commit is contained in:
luying
2022-04-02 17:43:12 +08:00
parent f50c32079c
commit 89744aeb13
11 changed files with 193 additions and 7 deletions

View File

@@ -7,7 +7,7 @@ import { SkinUpdate } from '../../../db/Skin';
import { RankFirstModel, RankFirstType } from '../../../db/RankFirst';
import { Figure } from '../../../domain/dbGeneral';
import { PVPConfigModel, PVPConfigType } from '../../../db/SystemConfig';
import { treatRoleName, taflush } from '../../../services/sdkService';
import { treatRoleName, taflush, sendSurveyMail } from '../../../services/sdkService';
import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService';
import { errlogger } from '../../../util/logger';
@@ -132,4 +132,13 @@ export class RoleRemote {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
public async sendSurveyMail(code: string) {
try {
await sendSurveyMail(code);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
}

View File

@@ -545,7 +545,8 @@ export async function redisSubScribe() {
let refundChannel = getRedisSubChannel(REDIS_KEY.REFUND_CHANNEL, env);
let treatRoleChannel = getRedisSubChannel(REDIS_KEY.TREAT_ROLE_CHANNEL, env);
let treatGuildChannel = getRedisSubChannel(REDIS_KEY.TREAT_GUILD_CHANNEL, env);
await redisClientPub().subscribeAsync(payChannel, treatRoleChannel, treatGuildChannel, refundChannel);
let surveyChannel = getRedisSubChannel(REDIS_KEY.SURVEY_CHANNEL, env);
await redisClientPub().subscribeAsync(payChannel, treatRoleChannel, treatGuildChannel, refundChannel, surveyChannel);
redisClientPub().on('message', (channel, message) => {
console.log('**********redisSubScribe*******')
console.log('channel: ', channel, payChannel);
@@ -566,7 +567,10 @@ export async function redisSubScribe() {
let servers = pinus.app.getServersByType('order');
let server = getRandSingleEelm(servers);
pinus.app.rpc.order.orderRemote.refundOrderFromRedisPub.toServer(server.id, message);
} else if (channel == surveyChannel) {
let servers = pinus.app.getServersByType('role');
let server = getRandSingleEelm(servers);
pinus.app.rpc.role.roleRemote.sendSurveyMail.toServer(server.id, message);
}
});
}

View File

@@ -11,11 +11,13 @@ import { GuildModel } from "../db/Guild";
import { getRoleOnlineInfo, updateUserInfo } from "./redisService";
import { Application, pinus } from "pinus";
import { getGuildChannelSid } from "./chatService";
import { getRandSingleEelm, readWordTxt, resResult, writeWordTxt } from "../pubUtils/util";
import { getRandSingleEelm, parseGoodStr, readWordTxt, resResult, writeWordTxt } from "../pubUtils/util";
const ThinkingAnalytics = require("thinkingdata-node");
import Trie from '../pubUtils/trie';
import _ = require("underscore");
import { getGoldObject } from "./role/rewardService";
import { SurveyRecModel } from "../db/SurveyRec";
import { SurveyModel } from "../db/Survery";
// 检查私聊是否合法
@@ -283,4 +285,17 @@ export async function checkFilterWords(word: string) {
let server = getRandSingleEelm(servers);
return await pinus.app.rpc.chat.chatRemote.checkFilterWords.toServer(server.id, word);
}
}
export async function sendSurveyMail(code: string) {
let rec = await SurveyRecModel.findByCode(code);
if(!rec || rec.hasSentMail) return false;
let survey = await SurveyModel.findBySurveyId(rec.surveyId);
if(!survey) return false;
let reward = parseGoodStr(survey.reward);
await sendMailByContent(MAIL_TYPE.SEND_MAIL, rec.roleId, { goods: reward, params: [survey.mailContent] });
rec = await SurveyRecModel.send(rec.code);
}

View File

@@ -34,4 +34,6 @@ export enum SDK_TA_CONST {
APPID = '74120ffc6f2945448cc60bf1540c5ad4',
SERVER_URL = 'https://shushu.xyplay.cn',
LOG_PATH = '/root/zyz/game-server/logs/ta',
}
}
export const WJX_KEY = "f98551ef-4c7a-4ae2-abda-b7cca2684fe6"

View File

@@ -242,6 +242,7 @@ export enum REDIS_KEY {
TREAT_GUILD_CHANNEL = 'treatGuild', // 处理公会账号名频道
GUILD_FUND = 'guildFund', // 限时排行
SUM_CE_SNAPSHOT = "sumCeTL", // 限时战力排行榜
SURVEY_CHANNEL = 'survey', // 文件频道
}
// 各排行榜对应hash的key

32
shared/db/Survery.ts Normal file
View File

@@ -0,0 +1,32 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
@index({ id: 1 })
@index({ seasonNum: 1 })
export default class Survey extends BaseModel {
@prop({ required: true })
surveyId: string; // 问卷id
@prop({ required: true })
surveyName: string; // 问卷id
@prop({ required: true })
roleIndex: number; // 问卷id
@prop({ required: true })
reward: string; // 奖励
@prop({ required: true })
mailContent: string; // 邮件文字
public static async findBySurveyId(surveyId: string) {
let rec: SurveyType = await SurveyModel.findOne({ surveyId }).lean();
return rec;
}
}
export const SurveyModel = getModelForClass(Survey);
export interface SurveyType extends Pick<DocumentType<Survey>, keyof Survey> {};
export type SurveyUpdate = Partial<SurveyType>; // 将所有字段变成可选项

52
shared/db/SurveyRec.ts Normal file
View File

@@ -0,0 +1,52 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { genCode } from '../pubUtils/util';
@index({ id: 1 })
@index({ seasonNum: 1 })
export default class SurveyRec extends BaseModel {
@prop({ required: true, default: 1 })
code: string; // 编码
@prop({ required: true, default: 1 })
roleId: string; // 玩家id
@prop({ required: true })
surveyId: string; // 问卷id
@prop({ required: true })
index: string; // 有没有发邮件
@prop({ required: true })
hasSentMail: boolean; // 有没有发邮件
@prop({ required: true })
json: string; // 整个回调
public static async findByRoleIdAndId(roleId: string, surveyId: string) {
let rec: SurveyRecType = await SurveyRecModel.findOne({ roleId, surveyId }).lean();
return rec;
}
public static async findByCode(code: string) {
let rec: SurveyRecType = await SurveyRecModel.findOne({ code }).lean();
return rec;
}
public static async createSurveyRec(roleId: string, surveyId: string, index: string, json: string) {
let code = genCode(8);
let rec: SurveyRecType = await SurveyRecModel.findOneAndUpdate({ roleId, surveyId }, { $set: { hasSentMail: false, json, index, code } }, { upsert: true, new: true }).lean();
return rec;
}
public static async send(code: string) {
let rec: SurveyRecType = await SurveyRecModel.findOneAndUpdate({ code }, { $set: { hasSentMail: true } }).lean();
return rec;
}
}
export const SurveyRecModel = getModelForClass(SurveyRec);
export interface SurveyRecType extends Pick<DocumentType<SurveyRec>, keyof SurveyRec> {};
export type SurveyRecUpdate = Partial<SurveyRecType>; // 将所有字段变成可选项

View File

@@ -1,4 +1,4 @@
import { REDIS_KEY, SDK_37_ADDR, SDK_37_CONST } from '../consts';
import { REDIS_KEY, SDK_37_ADDR, SDK_37_CONST, WJX_KEY } from '../consts';
import { request37 } from './httpUtil';
import { nowSeconds } from './timeUtil';
import { LoginValidataReturn37, Chat37Params, GetServerListParam } from '../domain/sdk';
@@ -12,6 +12,12 @@ export function md5(str: string, treatStr?: (str: string) => string) {
return crypto.createHash('md5').update(str, 'utf8').digest("hex");
};
export function sha1(str: string, treatStr?: (str: string) => string) {
if(treatStr) str = treatStr(str);
// console.log('*****str', str)
return crypto.createHash('sha1').update(str, 'utf8').digest("hex");
}
export function getMd5ObjSign(obj: any, joinMark: string, treatStr?: (str: string) => string) {
const str = [];
Object.keys(obj).sort().forEach((key) => {
@@ -36,7 +42,6 @@ export async function checkMd5Sign(obj: any, treatStr?: (str: string) => string)
return false;
}
/************** 37sdk **************/
export function get37Md5SignA(body: any, key: string) {
@@ -123,4 +128,14 @@ function treatVid(str) {
export function getRedisSubChannel(key: REDIS_KEY, env: string) {
return `${key}:${env}`;
}
/********* 问卷星加密 *********/
export function checkWjxSign(activity: string, index: string, sign: string) {
const str = `${activity}${index}${WJX_KEY}`;
let signResult = sha1(str);
console.log('##### checkWjxSign', str, signResult, sign);
if(signResult != sign) return false;
return true;
}

View File

@@ -54,4 +54,11 @@ export default class SdkController extends Controller {
ctx.body = await ctx.service.sdk.getServerList(params);
return;
}
public async wjxCallback() {
const { ctx } = this;
ctx.body = await ctx.service.wjx.wjxCallback(ctx.request.body);
return;
}
}

View File

@@ -35,4 +35,7 @@ export default (app: Application) => {
router.get('/cb/getserverlist', controller.sdk.getServerList);
router.post('/cb/getserverlist', controller.sdk.getServerList);
router.post('/cb/refundioscallback', controller.sdk.refundIOSCallback);
// 问卷星回调
router.post('/cb/wjx', controller.sdk.wjxCallback)
};

View File

@@ -0,0 +1,46 @@
import { SurveyRecModel } from '@db/SurveyRec';
import { SurveyModel } from '@db/Survery';
import { checkWjxSign, getRedisSubChannel } from 'app/pubUtils/sdkUtil';
import { Service } from 'egg';
import { RedisClient } from 'redis';
import { REDIS_KEY } from '@consts';
import { RoleModel } from '@db/Role';
/**
* Test Service
*/
export default class Sdk extends Service {
public async wjxCallback(params: any) {
// 1. 检查sign
if(!checkWjxSign(params.activity, params.index, params.sign)) {
return 0
}
// 2. 查询配置
let curConfig = await SurveyModel.findBySurveyId(params.activity);
if(!curConfig) return 0;
let roleId = params[`q${curConfig.roleIndex}`];
if(!roleId) return 0;
let role = await RoleModel.findByRoleId(roleId);
if(!role) return 0;
let rec = await SurveyRecModel.findByRoleIdAndId(roleId, params.activity);
if(rec) return 0;
rec = await SurveyRecModel.createSurveyRec(roleId, params.activity, params.index, JSON.stringify(params));
// 3. 发邮件
let redisClient: RedisClient = this.app.context.redisClient;
let name = getRedisSubChannel(REDIS_KEY.SURVEY_CHANNEL, this.app.config.env);
let result = await redisClient.publishAsync(name, rec.code);
if(result == 0) {
console.error('用户名违规处理, 未发布到订阅频道');
return 0
}
return 1
}
}