using Common.Models.PubClass; using Common.Models.UnqTables; using Server.MyClass.Class; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Web.Http; namespace Server.Controllers.OpenManagement { public class DeviceController : DefaultController { /// /// 连接客户端 /// /// [HttpPost, ErrorFilter] public WebResult Connection() { var Id = GetString("Id", true); var InternetIP = GetString("InternetIP", true); var ClientVersion = GetString("ClientVersion", true); Version v = null; if (Id.Length != 32) return PutData("Id 建议生成32位的唯一数,保证设备的准确性!"); if (!Regex.Match(InternetIP, @"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})").Success) return PutData("IP信息不准确,请务必查询真实外网IP!"); if (!Version.TryParse(ClientVersion, out v)) return PutData("您的版本信息有误,请输入一个正确的版本信息!"); Device Device = Db.Queryable().Single(f => f.Id == Id); if (Device == null) { Device = new Device() { Id = Id }; } Device.Version = ClientVersion; Device.InternetIP = InternetIP; Device.Token = System.Guid.NewGuid().ToString(); Device.LoginTime = DateTime.Now; Db.Storageable(Device).ExecuteCommand(); if (Client.OnlineDevices.ContainsKey(Id)) { Client.OnlineDevices[Id] = new MyClass.Class.DeviceSession(); } else { if (!Client.OnlineDevices.TryAdd(Id, new MyClass.Class.DeviceSession())) return PutError; } return PutData(new { Token = Device.Token, MysqlName = Client.Config.MysqlName, MysqlHost = Client.Config.MysqlHost, MysqlPort = Client.Config.MysqlPort, MysqlPass = Client.Config.MysqlPass, MysqlUser = Client.Config.MysqlUser }); } [HttpPost, ErrorFilter] public WebResult Reading() { var session = CheckLoginDevice(); if (session == null) return PutData("机器人登录失效,请重新登录"); //如果服务端重启了,有可能就找不到,所以这里需要自动添加 try { session.IsReading = true; session.ReadTime = DateTime.Now; List ResposeMsgs = new List(); var time = DateTime.Now.AddSeconds(180); while (time > DateTime.Now) { if (session.Messages.Count > 0) { var Msg = session.Messages.Dequeue(); if (Msg != null) ResposeMsgs.Add(Msg); } else { if (ResposeMsgs.Count > 0) break; Thread.Sleep(100); continue; } } return PutData(ResposeMsgs); } finally { session.IsReading = false; } } [HttpPost, ErrorFilter] public WebResult Reply() { var device = CheckLoginDevice(); if (device == null) return PutData("机器人登录失效,请重新登录"); //要回复的ID var Replyid = GetString("Msgid", true); var Content = GetString("Content", true); Client.ReplyMessages.Add(Replyid, new DeviceReplyMessage() { Replyid = Replyid, Content = Content, CreateTime = DateTime.Now }); return PutSuccess; } [HttpPost, ErrorFilter] public WebResult SetRobotId() { var session = CheckLoginDevice(); if (session == null) return PutData("机器人登录失效,请重新登录"); var robotId = GetInt("RobotId", true); if (robotId == 0) return PutData("设置失败,机器人的编号不能为0"); if (robotId != device.RobotId) { var oldRobots = Client.OnlineDevices.Where(x => x.Value.RobotId == robotId && x.Key != device.Id).ToList(); foreach (var item in oldRobots) { Client.OnlineDevices.TryRemove(item.Key, out _); } session.RobotId = robotId; device.RobotId = robotId; session.RobotId = robotId; Db.Storageable(device).ExecuteCommand(); } return PutSuccess; } private Device device; private DeviceSession CheckLoginDevice() { var Id = GetString("Id", true); var Token = GetString("Token", true); device = Db.Queryable().WithCache().Single(f => f.Id == Id); if (Client.OnlineDevices.ContainsKey(Id) && device != null && device.Token == Token) { return Client.OnlineDevices[Id]; } return null; } } }