Example #1
0
        public bool RawObject_Received(object rawObject)
        {
            var handled = false;

            if (!(rawObject is string rawJson))
            {
                return(handled);
            }

            dynamic obj = JsonConvert.DeserializeObject(rawJson);

            try
            {
                if (obj.post_type == "message")
                {
                    if (obj.message_type == "private") // 私聊
                    {
                        CoolQPrivateMessageApi parsedObj = JsonConvert.DeserializeObject <CoolQPrivateMessageApi>(rawJson);
                        var arg = new MessageEventArgs(parsedObj);
                        PrivateMessageReceived?.Invoke(this, arg);
                        MessageReceived?.Invoke(this, arg);
                    }
                    else if (obj.message_type == "group") // 群聊
                    {
                        CoolQGroupMessageApi parsedObj = JsonConvert.DeserializeObject <CoolQGroupMessageApi>(rawJson);
                        var arg = new MessageEventArgs(parsedObj);
                        DiscussMessageReceived?.Invoke(this, arg);
                        MessageReceived?.Invoke(this, arg);
                    }
                    else if (obj.message_type == "discuss") // 讨论组
                    {
                        CoolQDiscussMessageApi parsedObj = JsonConvert.DeserializeObject <CoolQDiscussMessageApi>(rawJson);
                        var arg = new MessageEventArgs(parsedObj);
                        GroupMessageReceived?.Invoke(this, arg);
                        MessageReceived?.Invoke(this, arg);
                    }
                }
                else
                {
                    EventReceived?.Invoke(this, new EventEventArgs(rawJson));
                    if (obj.post_type == "notice")
                    {
                        if (obj.notice_type == "group_upload") // 群文件上传
                        {
                            GroupFileUpload parsedObj = JsonConvert.DeserializeObject <GroupFileUpload>(rawJson);
                            var             arg       = new NoticeEventArgs(parsedObj);
                            GroupFileUploaded?.Invoke(this, arg);
                            Noticed?.Invoke(this, arg);
                        }
                        else if (obj.notice_type == "group_admin") // 群管理员变动
                        {
                            GroupAdminChange parsedObj = JsonConvert.DeserializeObject <GroupAdminChange>(rawJson);
                            var arg = new NoticeEventArgs(parsedObj);
                            GroupAdminChanged?.Invoke(this, arg);
                            Noticed?.Invoke(this, arg);
                        }
                        else if (obj.notice_type == "group_decrease" || obj.notice_type == "group_increase") // 群成员增加/减少
                        {
                            GroupMemberChange parsedObj = JsonConvert.DeserializeObject <GroupMemberChange>(rawJson);
                            var arg = new NoticeEventArgs(parsedObj);
                            Noticed?.Invoke(this, arg);
                            GroupMemberChanged?.Invoke(this, arg);
                        }
                        else if (obj.notice_type == "friend_add") // 好友添加
                        {
                            FriendAdd parsedObj = JsonConvert.DeserializeObject <FriendAdd>(rawJson);
                            var       arg       = new NoticeEventArgs(parsedObj);
                            FriendAdded?.Invoke(this, arg);
                            Noticed?.Invoke(this, arg);
                        }
                    }
                    else if (obj.post_type == "request")
                    {
                        if (obj.request_type == "friend") // 加好友请求
                        {
                            FriendRequest parsedObj = JsonConvert.DeserializeObject <FriendRequest>(rawJson);
                            var           arg       = new RequestEventArgs(parsedObj);
                            FriendRequested?.Invoke(this, arg);
                            Requested?.Invoke(this, arg);

                            //// TODO,临时
                            //CqApi.SendPrivateMessage("2241521134",
                            //    string.Format("{0} ({1})邀请加我为好友",
                            //        CqApi.GetStrangerInfo(parsedObj.UserId.ToString()).Data?.Nickname, parsedObj.UserId));
                        }
                        else if (obj.request_type == "group") // 加群请求/邀请
                        {
                            GroupInvite parsedObj = JsonConvert.DeserializeObject <GroupInvite>(rawJson);
                            var         arg       = new RequestEventArgs(parsedObj);
                            GroupRequested?.Invoke(this, arg);
                            Requested?.Invoke(this, arg);

                            //// TODO,临时
                            //if (parsedObj.SubType == "invite")
                            //{
                            //    CqApi.SendPrivateMessage("2241521134",
                            //        string.Format("{0} ({1})邀请我加入群{2}",
                            //            CqApi.GetStrangerInfo(parsedObj.UserId.ToString()).Data?.Nickname, parsedObj.UserId,
                            //            parsedObj.GroupId));
                            //}
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorOccured?.Invoke(this, new ExceptionEventArgs(null, ex));
            }

            return(handled);
        }
Example #2
0
        public override CoolQRouteMessage OnMessageReceived(CoolQScopeEventArgs scope)
        {
            var routeMsg = scope.RouteMessage;
            // 接收的信息
            string message = routeMsg.RawMessage;
            // 发送者的QQ
            string userId = routeMsg.UserId;

            UserId = userId;
            // 发送者所在群ID(若是私聊或讨论组则为null)
            string groupId = routeMsg.GroupId;
            // 发送者所在讨论组ID(若是私聊或群则为null)
            string discussId = routeMsg.DiscussId;
            // 包含消息种类,分别为Group, Discuss, Private,省去判断以上是否为null来判定消息种类
            MessageType type = routeMsg.MessageType;

            if (type != MessageType.Private)
            {
                Logger.Error("不能非私聊");
                //return null;  // 返回null则不返回消息
            }

            // 接收的信息的Id,用于撤回等操作
            long msgId = routeMsg.MessageId;

            // 若是命令,下面两个字段不为null,当接收消息是 "/demo asdf 1234" 的情况:
            // 此字段为 "demo"
            string command = routeMsg.CommandName;
            // 此字段为 "asdf 1234"
            string argString = routeMsg.ArgString;
            // 当前处于的权限状态,默认为Public(即开放权限)
            // 当用户执行 /sudo 或 /root 会分别触发 Admin(对应群的管理员)和 Root(系统管理员),以此做出对应权限所对应的功能
            Authority level = routeMsg.CurrentAuthority;

            if (level == Authority.Public)
            {
                Logger.Info("当前所用权限:Public");
            }
            else if (level == Authority.Admin)
            {
                Logger.Info("当前所用权限:Admin");
            }
            else if (level == Authority.Root)
            {
                Logger.Info("当前所用权限:Root");
            }

            // 暂无实际用处,当前为框架所用,后续会有变动
            string fullcmd = routeMsg.FullCommand;
            // 包含json所传原生参数,通常只有少数情况会使用(获取字体,发送时间,匿名情况等)
            CoolQPrivateMessageApi privateObj = routeMsg.Private;
            CoolQDiscussMessageApi discussObj = routeMsg.Discuss;
            CoolQGroupMessageApi   groupObj   = routeMsg.Group;

            // 假设做一个定时报告程序(此仅为全局共享,对于用户用途不大)
            if (string.IsNullOrEmpty(argString))
            {
                return(routeMsg.ToSource("请填写参数", enableAt: true));
            }
            string[] param = argString.Split(" ");
            if (param.Length > 2)
            {
                return(routeMsg.ToSource("参数不正确", enableAt: true));
            }

            if (param[0] == "start" && int.TryParse(param[1], out int sleepTime))
            {
                // 默认处理机制为单线程,返回一个对象主线程继续工作
                // 若需新建线程,则手动处理:
                if (_tThread != null && _tThread.IsAlive)
                {
                    return(routeMsg.ToSource("计时器正在工作,请先停止", enableAt: true));
                }

                _tThread = new Thread(new ParameterizedThreadStart(MultiThread));
                _tThread.Start(sleepTime);

                string reply = "启动了计时器";
                // 当所用参数为(string,CommonMessage),则自动返回给所在群(组)的所在成员(通常不用其他重载,为框架所用)
                return(routeMsg.ToSource(reply, enableAt: true));
            }
            else if (param[0] == "stop" && param.Length == 1)
            {
                if (_tThread != null && _tThread.IsAlive)
                {
                    _tThread.Abort();
                }
                string reply = "计时器已经停止";
                return(routeMsg.ToSource(reply, enableAt: true));
            }
            else
            {
                return(routeMsg.ToSource("参数不正确", enableAt: true));
            }

            // 若需回复至别处,需以下实现
            string reply2   = "回复到了别处";
            string userId2  = "xxxxxxx";
            long   groupId2 = 123456;

            SendMessage(new CoolQRouteMessage(reply2, new CoolQIdentity(groupId2, MessageType.Group), userId2));
            return(null);
        }