防沉迷:不使用厚土sdk
This commit is contained in:
@@ -17,7 +17,7 @@ import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil';
|
||||
import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin } from '../../../services/redisService';
|
||||
|
||||
import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildChannel, leaveSysChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService';
|
||||
import { reportOneOnline } from '../../../services/timeTaskService';
|
||||
import { reportOneOnline, savePlayTime } from '../../../services/authenticateService';
|
||||
import { Rank } from '../../../services/rankService';
|
||||
import { checkTaskWithRole, } from '../../../services/taskService';
|
||||
import { pushData, everydayRefresh } from '../../../services/connectorService';
|
||||
@@ -81,7 +81,7 @@ export class EntryHandler {
|
||||
let skins = await SkinModel.findbyRole(role.roleId);
|
||||
await chackFunOpenWhenLogin(role, session);
|
||||
if (role.hasInit) await loginRefresh(role.roleId);
|
||||
reportOneOnline(role.roleId, user.userCode, self.app.get('serverId'), user.pkgName);
|
||||
reportOneOnline(role.roleId, user.userCode, self.app.get('serverId'), true, user);
|
||||
|
||||
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });
|
||||
r.setRankWithRoleInfo(role.roleId, role.heroNum, role.heroNumUpdatedAt, role);
|
||||
@@ -196,7 +196,7 @@ export class EntryHandler {
|
||||
const teamCode: string = session.get('teamCode');
|
||||
roleLeave(roleId).then(function (roleInfo) {
|
||||
if (roleInfo.isOnline) {
|
||||
reportOneOnline(roleId, roleInfo.userCode, sid, roleInfo.pkgName);
|
||||
savePlayTime(roleInfo.userCode);
|
||||
}
|
||||
});
|
||||
rmRoleFromQueue(roleId, sid, COM_BTL_QUALITY, null); // 删除redis中寻宝的匹配记录
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
import moment = require("moment");
|
||||
import { pinus } from "pinus";
|
||||
import { ADDICTION_PREVENTION_CODE, ADULT_AGE, GUEST_MAX_TIME, STATUS } from "../consts";
|
||||
import { UserModel, UserType } from "../db/User";
|
||||
import { getAge } from "../pubUtils/timeUtil";
|
||||
import { resResult } from "../pubUtils/util";
|
||||
import { incOnlineTime, setOnlineTime } from "./redisService";
|
||||
import { checkTeeanAgerTime } from '../pubUtils/authenticateUtil';
|
||||
|
||||
export async function reportOneOnline(roleId: string, userCode: string, sid: string, isLogin: boolean = false, user?: UserType) {
|
||||
if (!user) user = await UserModel.findUserByUserCode(userCode);
|
||||
if (!user) return false;
|
||||
|
||||
let sumTime = await incOnlineTime(userCode, false, 5 * 60); // 返回单位为分
|
||||
let todaySumTime = await incOnlineTime(userCode, true, 5 * 60);
|
||||
|
||||
let { isGuest, hasAuthenticated, birthday } = user;
|
||||
let age = getAge(birthday);
|
||||
let isAdult = age >= ADULT_AGE;
|
||||
|
||||
if (isGuest || !hasAuthenticated) {
|
||||
if (sumTime > GUEST_MAX_TIME) {
|
||||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||||
isGuest,
|
||||
guestTime: sumTime, // 游客已体验时间
|
||||
hasAuthenticated, // 是否进行过实名认证
|
||||
isAdult, // 是否已成年
|
||||
todayPlayTime: todaySumTime, // 今天已游戏时长
|
||||
type: ADDICTION_PREVENTION_CODE.GUEST,
|
||||
}), [{ uid: roleId, sid: sid }]);
|
||||
}
|
||||
} else {
|
||||
let code = checkTeeanAgerTime(isAdult, todaySumTime);
|
||||
if(code != ADDICTION_PREVENTION_CODE.SUCCESS) {
|
||||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||||
isGuest,
|
||||
guestTime: 0, // 游客已体验时间
|
||||
hasAuthenticated, // 是否进行过实名认证
|
||||
isAdult, // 是否已成年
|
||||
todayPlayTime: todaySumTime, // 今天已游戏时长
|
||||
type: code
|
||||
}), [{ uid: roleId, sid: sid }]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function savePlayTime(userCode: string, user?: UserType) {
|
||||
if (!user) user = await UserModel.findUserByUserCode(userCode);
|
||||
if (!user) return false;
|
||||
|
||||
let time = Date.now() - user.lastLoginTime.getTime();
|
||||
let setsumTime = (user.playTime||0) + Math.floor(time/1000);
|
||||
let settodaySumTime = (user.todayPlayTime||0) + Math.floor(time/1000);
|
||||
|
||||
let sumTime = await setOnlineTime(userCode, false, setsumTime); // 返回单位为分
|
||||
let todaySumTime = await setOnlineTime(userCode, true, settodaySumTime);
|
||||
|
||||
let { isGuest, hasAuthenticated } = user;
|
||||
await UserModel.updatePlayTime(userCode, isGuest || !hasAuthenticated, settodaySumTime, setsumTime);
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import { GuildRankParam, GuildLeader, RankParam, LineupParam } from '../domain/r
|
||||
import { comBtlRanges } from '../pubUtils/data';
|
||||
import { setRankRedisFromDb } from './rankService';
|
||||
import { ServerlistModel } from '../db/Serverlist';
|
||||
import moment = require('moment');
|
||||
/**
|
||||
* 在服务重新启动时,将信息存入redis
|
||||
*/
|
||||
@@ -346,6 +347,34 @@ export async function getAllOnlineRoles() {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将玩家登录时间记录到
|
||||
* @param userCode 玩家user表里的userCode
|
||||
* @param isToday 累计记录还是当日记录
|
||||
* @returns 分钟
|
||||
*/
|
||||
export async function incOnlineTime(userCode: string, isToday: boolean, incTime: number) {
|
||||
moment.locale('zh-cn');
|
||||
let today = moment().format('YYYYMMDD');
|
||||
let key = isToday? REDIS_KEY.ONLINE_TIME: `${REDIS_KEY.ONLINE_TIME}:${today}`;
|
||||
if(isToday) {
|
||||
let tomorrow = moment().add(1, 'days').hours(0).minutes(0).seconds(0).format('x');
|
||||
await redisClient().expireatAsync(key, parseInt(tomorrow));
|
||||
}
|
||||
return await redisClient().hincrbyAsync(key, userCode, incTime);
|
||||
}
|
||||
|
||||
export async function setOnlineTime(userCode: string, isToday: boolean, setTime: number) {
|
||||
moment.locale('zh-cn');
|
||||
let today = moment().format('YYYYMMDD');
|
||||
let key = isToday? REDIS_KEY.ONLINE_TIME: `${REDIS_KEY.ONLINE_TIME}:${today}`;
|
||||
if(isToday) {
|
||||
let tomorrow = moment().add(1, 'days').hours(0).minutes(0).seconds(0).format('x');
|
||||
await redisClient().expireatAsync(key, parseInt(tomorrow));
|
||||
}
|
||||
return await redisClient().hsetAsync(key, userCode, setTime);
|
||||
}
|
||||
|
||||
|
||||
// 排行榜是否存在
|
||||
export async function smembersAsync(key: string) {
|
||||
|
||||
@@ -1,28 +1,23 @@
|
||||
|
||||
import { scheduleJob, Job, scheduledJobs } from 'node-schedule';
|
||||
import { scheduleJob, Job, } from 'node-schedule';
|
||||
import { PVPConfigModel } from '../db/SystemConfig';
|
||||
import PvpDefenseType, { PvpDefenseModel } from '../db/PvpDefense';
|
||||
import { PVP } from '../pubUtils/dicParam';
|
||||
import { nowSeconds, getAge, getTimeFun } from '../pubUtils/timeUtil';
|
||||
import { nowSeconds, getTimeFun } from '../pubUtils/timeUtil';
|
||||
import { getPvpGkWarIds, getPvpRankRewards, getPvpHeroRewards, getResultMaxRank, getTodayGuildActivity } from '../pubUtils/data';
|
||||
import { deepCopy, resResult, getRandSingleEelm } from '../pubUtils/util';
|
||||
import { deepCopy, getRandSingleEelm } from '../pubUtils/util';
|
||||
import { getLvByScore } from './pvpService';
|
||||
import { getAllOnlineRoles, getAllServers, initSingleRank, delGuildActivityRank } from './redisService';
|
||||
import { MAIL_TYPE, REDIS_KEY, ADULT_AGE, GUEST_MAX_TIME, ADDICTION_PREVENTION_CODE, GUILD_ACTIVITY_STATUS, GUILD_ACTIVITY_TYPE, TASK_TYPE, TIME_OUTPUT_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER } from '../consts';
|
||||
import { MAIL_TYPE, REDIS_KEY, GUILD_ACTIVITY_STATUS, GUILD_ACTIVITY_TYPE, TASK_TYPE, TIME_OUTPUT_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER } from '../consts';
|
||||
import { RoleModel } from '../db/Role';
|
||||
import { MailModel, MailType } from '../db/Mail';
|
||||
import { pinus } from 'pinus';
|
||||
import { indexOf } from 'underscore';
|
||||
import { PvpSeasonResultModel } from '../db/PvpSeasonResult';
|
||||
import { settleGuildWeekly } from './guildService';
|
||||
import { STATUS } from '../consts/statusCode';
|
||||
import { sendMailByContent } from './mailService';
|
||||
import { reportOnline } from '../pubUtils/httpUtil';
|
||||
import { UserModel } from '../db/User';
|
||||
import { getGuildActivityByDic, setMedianCe, sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivityService';
|
||||
import { getGuildActivityByDic, sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivityService';
|
||||
import { sendUngotDividendJob, startGuildAuction, startWorldAuction, stopAuction } from './auctionService';
|
||||
import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity';
|
||||
import { GuildModel } from '../db/Guild';
|
||||
import { dispatch } from '../util/dispatcher';
|
||||
import { Rank } from './rankService';
|
||||
import { checkTask } from './taskService';
|
||||
@@ -30,6 +25,7 @@ import { everydayRefresh } from './connectorService';
|
||||
import { initMarquee, initMaintenance } from './gmService';
|
||||
import moment = require('moment');
|
||||
import { CounterModel } from '../db/Counter';
|
||||
import { reportOneOnline } from './authenticateService';
|
||||
|
||||
const PER_SECOND = 1 * 1000;
|
||||
const PER_DAY = 24 * 60 * 60;
|
||||
@@ -336,56 +332,12 @@ export async function resetPvpRanks() {
|
||||
export async function reportOnlineSchedule() {
|
||||
let allRoles = await getAllOnlineRoles();
|
||||
console.log('reportOnlineSchedule all roles count: ', allRoles.length)
|
||||
for (let { roleId, userCode, sid, pkgName } of allRoles) {
|
||||
let result = reportOneOnline(roleId, userCode, sid, pkgName);
|
||||
for (let { roleId, userCode, sid } of allRoles) {
|
||||
let result = reportOneOnline(roleId, userCode, sid, false);
|
||||
if (!result) continue;
|
||||
}
|
||||
}
|
||||
|
||||
export async function reportOneOnline(roleId: string, userCode: string, sid: string, pkgName: string) {
|
||||
|
||||
let result = await reportOnline(userCode, pkgName); // 连接sdk
|
||||
if (!result || result.code == -1) return false;
|
||||
|
||||
let user = await UserModel.findUserByUserCode(userCode);
|
||||
if (!user) return false;
|
||||
let { reportTime = new Date(), lastLoginTime = new Date(), guestTime, isGuest, hasAuthenticated, birthday } = user;
|
||||
|
||||
let age = getAge(birthday);
|
||||
let isAdult = age >= ADULT_AGE;
|
||||
|
||||
if (isGuest || !hasAuthenticated) {
|
||||
let lastTime = lastLoginTime > reportTime ? lastLoginTime.getTime() : reportTime.getTime();
|
||||
let guestTimeInc = Math.floor((Date.now() - lastTime) / 1000);
|
||||
user = await UserModel.updatePlayTime(userCode, guestTimeInc, result.total); // 记录时间
|
||||
|
||||
guestTime = user.guestTime;
|
||||
|
||||
if (guestTime > GUEST_MAX_TIME) {
|
||||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||||
isGuest,
|
||||
guestTime, // 游客已体验时间
|
||||
hasAuthenticated, // 是否进行过实名认证
|
||||
isAdult, // 是否已成年
|
||||
todayPlayTime: result.total, // 今天已游戏时长
|
||||
type: ADDICTION_PREVENTION_CODE.GUEST,
|
||||
}), [{ uid: roleId, sid: sid }]);
|
||||
}
|
||||
} else {
|
||||
if (result.code != ADDICTION_PREVENTION_CODE.SUCCESS && result.age != -1) { // 未成年人防沉迷
|
||||
user = await UserModel.updatePlayTime(userCode, 0, result.total, result.code); // 记录时间
|
||||
|
||||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||||
isGuest,
|
||||
guestTime, // 游客已体验时间
|
||||
hasAuthenticated, // 是否进行过实名认证
|
||||
isAdult, // 是否已成年
|
||||
todayPlayTime: result.total, // 今天已游戏时长
|
||||
type: result.code
|
||||
}), [{ uid: roleId, sid: sid }]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 军团活动,每晚8点开启
|
||||
|
||||
@@ -23,13 +23,15 @@ declare module 'redis' {
|
||||
// 删除哈希表 key 中的一个或多个指定字段
|
||||
hdelAsync(key: string, field: string): Promise<number>;
|
||||
// 将哈希表 key 中的字段 field 的值设为 value
|
||||
hsetAsync(key: string, field: string, value: string): Promise<number>;
|
||||
hsetAsync<T>(key: string, field: string, value: T): Promise<T>;
|
||||
// 获取存储在哈希表中指定字段的值
|
||||
hgetAsync(key: string, field: string): Promise<string>;
|
||||
hgetAsync(key: string, field: string): Promise<any>;
|
||||
// 获取存储在哈希表中指定字段的值。
|
||||
hexistsAsync(key: string, field: string): Promise<number>;
|
||||
// 获取哈希表中所有字段和值
|
||||
hgetallAsync(key: string): Promise<any>;
|
||||
// 增值
|
||||
hincrbyAsync(key: string, field: string, inc: number): Promise<number>;
|
||||
|
||||
// 移除并返回集合中的一个随机元素
|
||||
spopAsync(key: string, count?: number): Promise<number>;
|
||||
|
||||
Reference in New Issue
Block a user