yz_server/Server/Controllers/OpenManagement/DeviceController.cs

160 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 连接客户端
/// </summary>
/// <returns></returns>
[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<Device>().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<DeviceMessage> ResposeMsgs = new List<DeviceMessage>();
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<Device>().WithCache().Single(f => f.Id == Id);
if (Client.OnlineDevices.ContainsKey(Id) && device != null && device.Token == Token)
{
return Client.OnlineDevices[Id];
}
return null;
}
}
}