2022-09-20 03:10:29 +00:00
using Api.Framework ;
using Api.Framework.Enums ;
using Api.Framework.Model ;
using Api.Framework.SDK ;
using Api.Framework.Tools ;
using Chat.Framework.WXSdk ;
using Chat.Framework.WXSdk.Implement ;
using MessageSupervises.Entitys ;
using MessageSupervises.Properties ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Threading.Tasks ;
namespace MessageSupervises
{
public class Class1 : Plugin
{
public Class1 ( )
{
this . Logo = Resources . 智 能 拦 截 ;
this . Name = Resources . PluginName ;
this . Note = Resources . PluginNote ;
}
#region 自 定 义 变 量
public static Config Config = null ;
private MainForm mainForm = null ;
#endregion
public override void Start ( )
{
try
{
var session = ApiClient . GetSession ( ) ;
#region 判 断 表 是 否 存 在 , 不 存 在 创 建 表
if ( ! session . TableExist < fl_plugin_messagesupervises_messinfo > ( ) )
{
session . CreateTable < fl_plugin_messagesupervises_messinfo > ( ) ;
session . AddIndex < fl_plugin_messagesupervises_messinfo > ( "member_id" ) ;
}
#endregion
//创建配置文件
Config = this . ReadConfig < Config > ( ) ;
SDK . ReciveIMEvent + = SDK_ReciveIMEvent ;
SDK . WXApplyGroupEvent + = SDK_WXApplyGroupEvent ;
SDK . WXApplyFriendEvent + = SDK_WXApplyFriendEvent ;
SDK . WXNewFriendEvent + = SDK_WXNewFriendEvent ;
2022-09-26 09:04:23 +00:00
ApiClient . BlackMemberFunc = ( ) = >
{
return Config . FrequencyCloudBlack ;
} ;
2022-09-20 03:10:29 +00:00
}
catch ( Exception ex )
{
this . OnLog ( ex . Message ) ;
}
}
private void Ding ( string message )
{
if ( Config . auth_dingding_swich )
ApiClient . SendNoticeMessage ( message , Config . notice_robotname ) ;
}
private bool _check_insert_black ( fl_member_info info , WeixinBase client , string remark , string message = "" )
{
if ( info . status = = MemberType . 白 名 单 ) return false ;
if ( Config . auth_black_swich & & client ! = null )
{
var session = ApiClient . GetSession ( ) ;
//15天内自动跳过
if ( session . TemporaryBypassedBlack ( info ) )
return false ;
bool flag = false ;
var time = DateTime . Now - info . crt_time ;
if ( time . TotalDays > = Config . auto_black_day & & info . finish_order < = Config . auto_black_order )
{
var alimama_order = session . Queryable < fl_order_alimama > ( ) . Where ( f = > f . db_userid = = info . id ) . Count ( ) ;
var pinduoduo_order = session . Queryable < fl_order_pinduoduo > ( ) . Where ( f = > f . db_userid = = info . id ) . Count ( ) ;
var jingdong_order = session . Queryable < fl_order_jingdong > ( ) . Where ( f = > f . db_userid = = info . id ) . Count ( ) ;
var count = alimama_order + pinduoduo_order + jingdong_order ;
if ( Config . auto_black_order > = count )
{
// this.OnLog("订单数量:" + count);
flag = true ;
}
}
if ( ! flag & & ! string . IsNullOrEmpty ( Config . auto_black_message ) & & Regex . Match ( message , Config . auto_black_message ) . Success )
flag = true ;
if ( flag )
{
info . status = MemberType . 黑 名 单 ;
info . blackout_time = DateTime . Now ;
session . SaveOrUpdate ( info ) ;
session . FindBlacklistMemberInfos ( true ) ; //刷新黑名单缓存
Ding ( $"增加黑名单提醒\r\n————\r\n事件类型: {" 收 到 消 息 "}\r\n微信账号: {client.WeixinHao}\r\n微信昵称: {client.User.Nick}\r\n客户账号: {info.username}\r\n客户昵称: {info.usernick}\r\n添加时间: {info.crt_time.ToString(" yyyy - MM - dd HH : mm : ss ")}" ) ;
return true ;
}
}
return false ;
}
/// <summary>
/// 禁止黑名单操作
/// </summary>
private bool _ForbidBlacklist ( string username , string usernick , string remark , WeixinBase client )
{
if ( client = = null ) return false ;
try
{
var session = ApiClient . GetSession ( ) ;
var info = session . Queryable < fl_member_info > ( ) . First ( f = > f . username = = username & & f . robot_type = = ( client . WeixinType = = WeixinType . QYHook微信 ? ChatType . 企 业 微 信 : ChatType . 微 信 ) /*f.robot_type == ChatType.微信*/ ) ;
if ( info ! = null )
{
if ( info . status = = MemberType . 白 名 单 ) return false ;
if ( info . status = = MemberType . 黑 名 单 )
{
Ding ( $"增加黑名单提醒\r\n————\r\n事件类型: {" 收 到 消 息 "}\r\n微信账号: {client.WeixinHao}\r\n微信昵称: {client.User.Nick}\r\n客户账号: {username}\r\n客户昵称: {usernick}" ) ;
return true ;
}
if ( Config . FrequencyCloudBlack )
{
CloudBlack cloud = new CloudBlack ( ) ;
var black = cloud . QueryBlack ( info ) ;
if ( black ! = null )
{
Ding ( $"云黑名单提醒\r\n————\r\n事件类型: {" 收 到 消 息 "}\r\n微信账号: {client.WeixinHao}\r\n微信昵称: {client.User.Nick}\r\n客户账号: {username}\r\n客户昵称: {usernick}\r\n拉黑原因: {black.remark}" ) ;
if ( black . iscloud )
{
info . status = MemberType . 黑 名 单 ;
ApiClient . GetSession ( ) . SaveOrUpdate ( info ) ;
}
return true ;
}
else
return false ;
}
return _check_insert_black ( info , client , remark ) ;
}
else
{
CloudBlack cloud = new CloudBlack ( ) ;
return cloud . QueryBlack ( username , ( client . WeixinType = = WeixinType . QYHook微信 ? ChatType . 企 业 微 信 : ChatType . 微 信 ) ) ! = null ;
}
}
catch ( Exception )
{ }
return false ;
}
private void SDK_WXNewFriendEvent ( object sender , Chat . Framework . WXSdk . Events . WXNewFriend e )
{
e . Cancel = _ForbidBlacklist ( e . Friend . UserName , e . Friend . NickName , $"新增好友事件" , e . Client ) ;
}
private void SDK_WXApplyFriendEvent ( object sender , Chat . Framework . WXSdk . Events . WXApplyFriend e )
{
e . Cancel = _ForbidBlacklist ( e . NewFriendWxid , e . NewFriendNick , $"申请添加好友" , e . Client ) ;
}
private void SDK_WXApplyGroupEvent ( object sender , Chat . Framework . WXSdk . Events . WXApplyGroup e )
{
e . Cancel = _ForbidBlacklist ( e . Wxid , e . Usernick , $"申请入群" , e . Client ) ;
}
public override void ShowForm ( )
{
try
{
if ( mainForm = = null | | mainForm . IsDisposed )
{
mainForm = new MainForm ( ) ;
mainForm . Show ( ) ;
}
mainForm . TopMost = true ;
mainForm . TopMost = false ;
}
catch ( Exception ex )
{
this . OnLog ( ex . Message ) ;
}
}
public override void Stop ( )
{
try
{
2022-09-26 09:04:23 +00:00
ApiClient . BlackMemberFunc = null ;
2022-09-20 03:10:29 +00:00
if ( mainForm ! = null ) //关闭窗体
{
mainForm . CloseForm ( ) ;
mainForm = null ;
}
}
catch ( Exception ex )
{
this . OnLog ( ex . Message ) ;
}
}
/// <summary>
/// 收到通用消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SDK_ReciveIMEvent ( object sender , ReciveIMEvent e )
{
try
{
var client = e . Sender as WeixinBase ;
//屏蔽机器人之间的消息
if ( Chat . Framework . ChatClient . WXClient . Values . ToList ( ) . FirstOrDefault ( f = > f . User . Username = = e . Username ) ! = null )
{
e . Cancel = true ;
return ;
}
var member = e . GetMemberinfo ( ) ;
if ( Config . ProhibitSL & & string . IsNullOrEmpty ( e . Groupid ) )
{
e . Cancel = true ; return ;
}
if ( Config . ProhibitQL & & ! string . IsNullOrEmpty ( e . Groupid ) )
{
e . Cancel = true ; return ;
}
if ( member . status = = MemberType . 白 名 单 )
return ;
else if ( member . status = = MemberType . 黑 名 单 )
{
//白名单关键词
if ( ! string . IsNullOrWhiteSpace ( Config . WhiteListWords ) )
{
var strs = Config . WhiteListWords . Split ( new string [ ] { "," } , StringSplitOptions . RemoveEmptyEntries ) . Select ( f = > f . Trim ( ) ) . ToList ( ) ;
if ( strs . FirstOrDefault ( f = > e . Message . Contains ( f ) ) ! = null )
return ;
}
if ( string . IsNullOrEmpty ( e . Groupid ) & & Class1 . Config . auth_delete_black )
{
var wechat = e . Sender as WXClientImpl_IPAD ;
if ( wechat ! = null )
{
this . OnLog ( $"自动删除黑名单好友:{e.NickName}({e.Username})" ) ;
wechat . DeleteFriend ( e . Username ) ;
}
}
if ( client ! = null ) Ding ( $"黑名单警告\r\n————\r\n事件类型: {" 收 到 消 息 "}\r\n微信账号: {client.WeixinHao}\r\n微信昵称: {client.User.Nick}\r\n客户账号: {e.Username}\r\n客户昵称: {e.NickName}" ) ;
e . Cancel = true ;
return ;
}
else if ( Config . FrequencyCloudBlack )
{
CloudBlack cloud = new CloudBlack ( ) ;
var black = cloud . QueryBlack ( member ) ;
if ( black ! = null )
{
if ( client ! = null )
Ding ( $"云黑名单警告\r\n————\r\n事件类型: {" 收 到 消 息 "}\r\n微信账号: {client.WeixinHao}\r\n微信昵称: {client.User.Nick}\r\n客户账号: {e.Username}\r\n客户昵称: {e.NickName}\r\n拉黑原因: {black.remark}" ) ;
e . Cancel = true ;
if ( black . iscloud )
{
member . status = MemberType . 黑 名 单 ;
ApiClient . GetSession ( ) . SaveOrUpdate ( member ) ;
}
return ;
}
}
//if (!string.IsNullOrEmpty(e.Groupid) && !Config.WhiteListSwitch && !Config.GroupWhiteList.Contains(e.Groupid))
//{ e.Cancel = true; return; }
if ( ! string . IsNullOrEmpty ( e . Groupid ) )
{
if ( ! Config . WhiteListSwitch )
{
if ( ( Config . GroupResponseType & & ! Config . GroupWhiteList . Contains ( e . Groupid ) ) | | ( ! Config . GroupResponseType & & Config . GroupWhiteList . Contains ( e . Groupid ) ) )
{ e . Cancel = true ; return ; }
}
if ( Config . ProhibitWxid & & Config . ProhibitWxidList . Length ! = 0 )
{
if ( Config . ProhibitWxidList . ToList ( ) . Contains ( e . Username ) )
{
e . Cancel = true ;
return ;
}
}
if ( Config . ProhibitNick & & Config . ProhibitNickList . Length ! = 0 )
{
var result = Config . ProhibitNickList . FirstOrDefault ( f = > e . NickName . Contains ( f ) ) ;
if ( ! string . IsNullOrEmpty ( result ) )
{
e . Cancel = true ;
return ;
}
}
}
else if ( string . IsNullOrEmpty ( e . Groupid ) )
{
if ( Config . ProhibitWxid & & Config . ProhibitWxidList . Length ! = 0 )
{
if ( Config . ProhibitWxidList . ToList ( ) . Contains ( e . Username ) )
{
e . Cancel = true ;
return ;
}
}
if ( Config . ProhibitNick & & Config . ProhibitNickList . Length ! = 0 )
{
var result = Config . ProhibitNickList . FirstOrDefault ( f = > e . NickName . Contains ( f ) ) ;
if ( ! string . IsNullOrEmpty ( result ) )
{
e . Cancel = true ;
return ;
}
}
var session = ApiClient . GetSession ( ) ;
int mess_count = 1 ;
var _flag = true ;
if ( mess_count < Config . FrequencyIntervalSendNum ) //用户发送消息
{
mess_count = int . Parse ( session . FindRow ( "select count(*) as num from fl_plugin_messagesupervises_messinfo where member_id = @id and send_time >= @time " , new { id = member . id , time = DateTime . Now . AddSeconds ( - Config . FrequencyIntervalSecs ) } ) [ "num" ] . ToString ( ) ) + 1 ;
if ( mess_count < Config . FrequencyIntervalSendNum ) //为超出了频率限制,插入数据库
{
session . ExcuteSQL ( "insert into fl_plugin_messagesupervises_messinfo (member_id,send_time) values (@member_id,@send_time)" , new { member_id = member . id , send_time = DateTime . Parse ( DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss" ) ) } ) ;
_flag = false ;
}
}
if ( _flag )
{
e . SendMessage ( Class1 . Config . FrequencyDetentionTip ) ;
member . status = MemberType . 黑 名 单 ; //拉入黑名单
session . SaveOrUpdate ( member ) ;
session . FindBlacklistMemberInfos ( true ) ; //刷新黑名单缓存
e . Cancel = true ;
return ;
}
}
e . Cancel = _check_insert_black ( e . GetMemberinfo ( ) , client , "收到聊天消息" , e . Message ) ;
if ( e . Cancel )
{
if ( string . IsNullOrEmpty ( e . Groupid ) & & Class1 . Config . auth_delete_black )
{
var wechat = e . Sender as Chat . Framework . WXSdk . Implement . WXClientImpl_IPAD ;
if ( wechat ! = null )
{
wechat . DeleteFriend ( e . Username ) ;
this . OnLog ( $"自动删除黑名单好友:{e.NickName}({e.Username})" ) ;
}
}
}
}
catch ( Exception ex )
{
this . OnLog ( ex . Message + " - " + ex . StackTrace ) ;
}
}
}
}