mirror of
https://github.com/yinxin630/fiora.git
synced 2026-06-04 21:03:18 +08:00
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:
parent
5218a5257d
commit
57a69e3792
@ -80,3 +80,4 @@ export const Redis = {
|
||||
};
|
||||
|
||||
export const DisableSendMessageKey = 'DisableSendMessage';
|
||||
export const DisableNewUserSendMessageKey = 'DisableNewUserSendMessageKey';
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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不能为空');
|
||||
|
||||
@ -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',
|
||||
};
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user