chore: 重写初始提交(清空历史,整理后全量提交)

This commit is contained in:
ywxapp
2026-08-16 16:54:14 +08:00
commit 6c1a106bc1
1808 changed files with 238144 additions and 0 deletions
@@ -0,0 +1,109 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace addon\wxchat\wprker\handle;
use GatewayWorker\Lib\Gateway;
/**
* MessageHandle 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class MessageHandle
{
protected static $sensitiveWords = ['fuck', 'shit', '赌博', '色情'];
/**
* 敏感词过滤
*/
protected static function filterSensitiveWords($text)
{
foreach (self::$sensitiveWords as $word) {
$text = str_replace($word, '**', $text);
}
return $text;
}
/**
* 处理普通消息(文本/图片/文件)
*/
protected static function handle($client_id, $message)
{
$header = $message->header;
$payload = $message->payload;
$fromUid = $header->from ?? '';
$uid = Gateway::getUidByClientId($client_id);
echo "Received message from UID: $fromUid, ClientID: $client_id , $uid\n";
if (! $uid || $uid != $fromUid) {
self::sendError($client_id, '未认证用户,无法发送消息');
return;
}
if ($header->type == 'text' && ! empty($payload->content)) {
$filteredContent = self::filterSensitiveWords($payload->content);
if ($filteredContent !== $payload->content) {
// file_put_contents('/tmp/sensitive_log.log', date('Y-m-d H:i:s') . " {$fromUid} 发送敏感词: {$data['payload']['content']}\n", FILE_APPEND);
$message->payload->content = $filteredContent;
}
}
// 消息持久化(重要!写入数据库)
// self::saveMessageToDB($data);
// 转发消息
if ($header->subtype === 'single') {
// 单聊:发送给目标用户
if (Gateway::isUidOnline($header->to)) {
Gateway::sendToUid($header->to, json_encode($message));
// 发送ACK给发送方(表示已送达)
$ackMsg = new Message();
$ackMsg->header->type = MessageType::System;
$ackMsg->header->subtype = MessageType::Delivered;
$ackMsg->payload->content = '不支持的消息类型! ';
Gateway::sendToUid($header->from, json_encode($message));
} else {
// 对方不在线,存离线消息(写入Redis/DB)
// self::saveOfflineMessage($toId, $data);
$newMessage = new Message();
$newMessage->header->type = MessageType::Error;
$newMessage->payload->content = "用户 {$toId} 不在线,消息已存为离线";
Gateway::sendToClient($client_id, json_encode($message));
}
} elseif ($header->subtype === 'group') {
// 群聊:发送给群内所有成员(排除自己)
// TODO: 从数据库获取群成员列表
// $members = self::getGroupMembers($toId);
// foreach ($members as $memberUid) {
// if ($memberUid != $fromUid && Gateway::hasUid($memberUid)) {
// Gateway::sendToUid($memberUid, json_encode($data));
// }
// }
Gateway::sendToGroup($header->to, json_encode($message));
$ackMsg = new Message();
$ackMsg->header->type = MessageType::System;
$ackMsg->header->subtype = MessageType::Delivered;
$ackMsg->payload->content = '不支持的消息类型! ';
Gateway::sendToUid($header->from, json_encode($message));
} else {
$errorMsg = new Message();
$errorMsg->header->type = MessageType::Error;
$errorMsg->payload->content = "未知会话类型";
Gateway::sendToClient($client_id, json_encode($errorMsg));
return;
}
// 回复发送方:消息已接收(前端更新状态用)
$receivedMsg = new Message();
$receivedMsg->header->type = MessageType::Error;
Gateway::sendToClient($client_id, json_encode($receivedMsg));
}
}