Support only seal new user (#461)

* Support config to disable new user send message

* Disable new user send message logic

* Support get system config

* Let new user as register from last year
This commit is contained in:
碎碎酱 2021-11-30 15:29:31 +08:00 committed by GitHub
parent 5218a5257d
commit 57a69e3792
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 130 additions and 28 deletions

View File

@ -80,3 +80,4 @@ export const Redis = {
};
export const DisableSendMessageKey = 'DisableSendMessage';
export const DisableNewUserSendMessageKey = 'DisableNewUserSendMessageKey';

View File

@ -15,6 +15,9 @@ export default function isAdmin(socket: Socket) {
'getUserIps',
'sealIp',
'getSealIpList',
'toggleSendMessage',
'toggleNewUserSendMessage',
'getSystemConfig',
]);
return async ([event, , cb]: MiddlewareArgs, next: MiddlewareNext) => {
socket.data.isAdmin =

View File

@ -19,7 +19,11 @@ import History, {
} from '@fiora/database/mongoose/models/history';
import Socket from '@fiora/database/mongoose/models/socket';
import { DisableSendMessageKey, Redis } from '@fiora/database/redis/initRedis';
import {
DisableSendMessageKey,
DisableNewUserSendMessageKey,
Redis,
} from '@fiora/database/redis/initRedis';
import client from '../../../config/client';
const { isValid } = Types.ObjectId;
@ -29,6 +33,8 @@ const FirstTimeMessagesCount = 15;
/** 每次调用接口获取的历史消息数 */
const EachFetchMessagesCount = 30;
const OneYear = 365 * 24 * 3600 * 1000;
/** 石头剪刀布, 用于随机生成结果 */
const RPS = ['石头', '剪刀', '布'];
@ -76,9 +82,21 @@ async function pushNotification(
*/
export async function sendMessage(ctx: Context<SendMessageData>) {
const disableSendMessage = await Redis.get(DisableSendMessageKey);
console.log('disableSendMessage =>', disableSendMessage);
assert(disableSendMessage !== 'true' || ctx.socket.isAdmin, '全员禁言中');
const disableNewUserSendMessage = await Redis.get(
DisableNewUserSendMessageKey,
);
if (disableNewUserSendMessage === 'true') {
const user = await User.findById(ctx.socket.user);
const isNewUser =
user && user.createTime.getTime() > Date.now() - OneYear;
assert(
ctx.socket.isAdmin || !isNewUser,
'新用户禁言中! 主群禁止闲聊, 多交流fiora和开发技术, 自发维护交流环境',
);
}
const { to, content } = ctx.data;
let { type } = ctx.data;
assert(to, 'to不能为空');

View File

@ -18,6 +18,7 @@ import {
getSealIpKey,
getSealUserKey,
DisableSendMessageKey,
DisableNewUserSendMessageKey,
Redis,
} from '@fiora/database/redis/initRedis';
@ -276,7 +277,8 @@ export async function getSTS(): Promise<STSResult> {
...result.credentials,
};
} catch (err) {
assert.fail(`获取 STS 失败 - ${err.message}`);
const typedErr = err as Error;
assert.fail(`获取 STS 失败 - ${typedErr.message}`);
}
}
@ -321,16 +323,34 @@ export async function uploadFile(
url: `/${ctx.data.fileName}`,
};
} catch (err) {
logger.error('[uploadFile]', err.message);
return `上传文件失败:${err.message}`;
const typedErr = err as Error;
logger.error('[uploadFile]', typedErr.message);
return `上传文件失败:${typedErr.message}`;
}
}
export async function toggleSendMessage(ctx: Context<{ enable: boolean }>) {
const { enable } = ctx.data;
console.log('enable =>', !enable);
await Redis.set(DisableSendMessageKey, (!enable).toString());
return {
msg: 'ok',
};
}
export async function toggleNewUserSendMessage(
ctx: Context<{ enable: boolean }>,
) {
const { enable } = ctx.data;
await Redis.set(DisableNewUserSendMessageKey, (!enable).toString());
return {
msg: 'ok',
};
}
export async function getSystemConfig() {
return {
disableSendMessage: (await Redis.get(DisableSendMessageKey)) === 'true',
disableNewUserSendMessage:
(await Redis.get(DisableNewUserSendMessageKey)) === 'true',
};
}

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState, useCallback } from 'react';
import React, { useEffect, useState } from 'react';
import { css } from 'linaria';
import Style from './Admin.less';
@ -14,16 +14,24 @@ import {
setUserTag,
sealIp,
toggleSendMessage,
toggleNewUserSendMessage,
getSystemConfig,
} from '../../service';
const styles = {
button: css`
width: 100px;
min-width: 100px;
height: 36px;
margin-right: 12px;
padding: 0 10px;
`,
};
type SystemConfig = {
disableSendMessage: boolean;
disableNewUserSendMessage: boolean;
};
interface AdminProps {
visible: boolean;
onClose: () => void;
@ -38,22 +46,28 @@ function Admin(props: AdminProps) {
const [sealUsername, setSealUsername] = useState('');
const [sealList, setSealList] = useState({ users: [], ips: [] });
const [sealIpAddress, setSealIpAddress] = useState('');
const [systemConfig, setSystemConfig] = useState<SystemConfig>();
/**
*
*/
const handleGetSealList = useCallback(async () => {
console.log('systemConfig ===>', systemConfig);
async function handleGetSealList() {
const sealListRes = await getSealList();
if (sealListRes) {
setSealList(sealListRes);
}
}, []);
}
async function handleGetSystemConfig() {
const systemConfigRes = await getSystemConfig();
if (systemConfigRes) {
setSystemConfig(systemConfigRes);
}
}
useEffect(() => {
if (visible) {
handleGetSystemConfig();
handleGetSealList();
}
}, [handleGetSealList, visible]);
}, [visible]);
/**
*
@ -102,12 +116,29 @@ function Admin(props: AdminProps) {
const isSuccess = await toggleSendMessage(false);
if (isSuccess) {
Message.success('开启禁言成功');
handleGetSystemConfig();
}
}
async function handleEnableSendMessage() {
const isSuccess = await toggleSendMessage(true);
if (isSuccess) {
Message.success('关闭禁言成功');
handleGetSystemConfig();
}
}
async function handleDisableSNewUserendMessage() {
const isSuccess = await toggleNewUserSendMessage(false);
if (isSuccess) {
Message.success('开启新用户禁言成功');
handleGetSystemConfig();
}
}
async function handleEnableNewUserSendMessage() {
const isSuccess = await toggleNewUserSendMessage(true);
if (isSuccess) {
Message.success('关闭新用户禁言成功');
handleGetSystemConfig();
}
}
@ -120,19 +151,38 @@ function Admin(props: AdminProps) {
>
<div className={Common.container}>
<div className={Common.block}>
<Button
className={styles.button}
type="danger"
onClick={handleDisableSendMessage}
>
</Button>
<Button
className={styles.button}
onClick={handleEnableSendMessage}
>
</Button>
{!systemConfig?.disableSendMessage ? (
<Button
className={styles.button}
type="danger"
onClick={handleDisableSendMessage}
>
</Button>
) : (
<Button
className={styles.button}
onClick={handleEnableSendMessage}
>
</Button>
)}
{!systemConfig?.disableNewUserSendMessage ? (
<Button
className={styles.button}
type="danger"
onClick={handleDisableSNewUserendMessage}
>
</Button>
) : (
<Button
className={styles.button}
onClick={handleEnableNewUserSendMessage}
>
</Button>
)}
</div>
<div className={Common.block}>
<p className={Common.title}></p>

View File

@ -375,6 +375,11 @@ export async function getSealList() {
return sealList;
}
export async function getSystemConfig() {
const [, systemConfig] = await fetch('getSystemConfig');
return systemConfig;
}
/**
*
* @param username
@ -417,3 +422,8 @@ export async function toggleSendMessage(enable: boolean) {
const [, result] = await fetch('toggleSendMessage', { enable });
return !!result;
}
export async function toggleNewUserSendMessage(enable: boolean) {
const [, result] = await fetch('toggleNewUserSendMessage', { enable });
return !!result;
}