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;
}
}
}