blizzless-diiis/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/PresenceService.cs

238 lines
11 KiB
C#

//Blizzless Project 2022
using System;
using Google.ProtocolBuffers;
using bgs.protocol;
using bgs.protocol.presence.v1;
using DiIiS_NA.Core.Logging;
using DiIiS_NA.LoginServer.Helpers;
using DiIiS_NA.LoginServer.AccountsSystem;
using DiIiS_NA.LoginServer.Base;
using System.Threading.Tasks;
namespace DiIiS_NA.LoginServer.ServicesSystem.Services
{
[Service(serviceID: 0xb, serviceName: "bnet.protocol.presence.PresenceService")]
public class PresenceService : bgs.protocol.presence.v1.PresenceService, IServerService
{
private static readonly Logger Logger = LogManager.CreateLogger();
public override void BatchSubscribe(IRpcController controller, BatchSubscribeRequest request, Action<BatchSubscribeResponse> done)
{
var response = BatchSubscribeResponse.CreateBuilder();
var EntityId = request.EntityIdList[0];
response.AddSubscribeFailed(SubscribeResult.CreateBuilder().SetEntityId(request.EntityIdList[0]).SetResult(0));
Task.Run(() =>
{
foreach (var req in request.EntityIdList)
{
switch (req.GetHighIdType())
{
case EntityIdHelper.HighIdType.AccountId:
{
var account = AccountManager.GetAccountByPersistentID(req.Low);
if (account != null)
{
Logger.MethodTrace("Subscribe() {0} {1}", (((HandlerController)controller).Client), account);
account.AddSubscriber((((HandlerController)controller).Client), request.ObjectId);
response.AddSubscribeFailed(SubscribeResult.CreateBuilder().SetEntityId(req)
.SetResult(0));
}
}
break;
case EntityIdHelper.HighIdType.GameAccountId:
{
var gameAccount = GameAccountManager.GetAccountByPersistentID(req.Low);
if (gameAccount != null)
{
Logger.MethodTrace("Subscribe() {0} {1}", (((HandlerController)controller).Client),
gameAccount);
gameAccount.AddSubscriber((((HandlerController)controller).Client), request.ObjectId);
response.AddSubscribeFailed(SubscribeResult.CreateBuilder().SetEntityId(req)
.SetResult(0));
}
}
break;
default:
Logger.Warn("Received an unhandled Presence.Subscribe request with type {0} (0x{1})", req.GetHighIdType(), req.High.ToString("X16"));
break;
}
}
//*/
});
done(response.Build());
//throw new NotImplementedException();
}
public override void BatchUnsubscribe(IRpcController controller, BatchUnsubscribeRequest request, Action<NoData> done)
{
Logger.Fatal("Batch Unsubscribe not implemented");
}
public override void Query(IRpcController controller, QueryRequest request, Action<QueryResponse> done)
{
var builder = QueryResponse.CreateBuilder();
switch (request.EntityId.GetHighIdType())
{
case EntityIdHelper.HighIdType.AccountId:
{
var gameAccount = AccountManager.GetAccountByPersistentID(request.EntityId.Low);
foreach (var key in request.KeyList)
{
Logger.Debug("Query() {0} {1} - {2}, {3}, {4}", (((HandlerController)controller).Client),
gameAccount, (FieldKeyHelper.Program)key.Program, (FieldKeyHelper.OriginatingClass)key.Group,
key.Field);
var field = gameAccount.QueryField(key);
if (field != null) builder.AddField(field);
}
}
break;
case EntityIdHelper.HighIdType.GameAccountId:
{
var gameAccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low);
foreach (var key in request.KeyList)
{
Logger.Debug("Query() {0} {1} - {2}, {3}, {4}", (((HandlerController)controller).Client),
gameAccount, (FieldKeyHelper.Program)key.Program,
(FieldKeyHelper.OriginatingClass)key.Group, key.Field);
var field = gameAccount.QueryField(key);
if (field != null) builder.AddField(field);
}
}
break;
default:
Logger.Warn("Received an unhandled Presence.Query request with type {0} (0x{1})", request.EntityId.GetHighIdType(), request.EntityId.High.ToString("X16"));
break;
}
done(builder.Build());
}
public override void Subscribe(IRpcController controller, SubscribeRequest request, Action<NoData> done)
{
Task.Run(() =>
{
switch (request.EntityId.GetHighIdType())
{
case EntityIdHelper.HighIdType.AccountId:
{
var gameAccount = AccountManager.GetAccountByPersistentID(request.EntityId.Low);
if (gameAccount != null)
{
Logger.MethodTrace("Subscribe() {0} {1}", (((HandlerController)controller).Client), gameAccount);
gameAccount.AddSubscriber((((HandlerController)controller).Client), request.ObjectId);
}
}
break;
case EntityIdHelper.HighIdType.GameAccountId:
{
var gameaccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low);
if (gameaccount != null)
{
Logger.MethodTrace("Subscribe() {0} {1}", (((HandlerController)controller).Client), gameaccount);
gameaccount.AddSubscriber((((HandlerController)controller).Client), request.ObjectId);
}
}
break;
default:
Logger.Warn("Received an unhandled Presence.Subscribe request with type {0} (0x{1})", request.EntityId.GetHighIdType(), request.EntityId.High.ToString("X16"));
break;
}
});
var builder = NoData.CreateBuilder();
done(builder.Build());
}
public override void Unsubscribe(IRpcController controller, UnsubscribeRequest request, Action<NoData> done)
{
switch (request.EntityId.GetHighIdType())
{
case EntityIdHelper.HighIdType.AccountId:
{
var gameAccount = AccountManager.GetAccountByPersistentID(request.EntityId.Low);
// The client will probably make sure it doesn't unsubscribe to a null ID, but just to make sure..
if (gameAccount != null)
{
gameAccount.RemoveSubscriber((((HandlerController) controller).Client));
Logger.MethodTrace("Unsubscribe() {0} {1}", (((HandlerController) controller).Client), gameAccount);
}
}
break;
case EntityIdHelper.HighIdType.GameAccountId:
{
var gameAccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low);
if (gameAccount != null)
{
gameAccount.RemoveSubscriber((((HandlerController) controller).Client));
Logger.MethodTrace("Unsubscribe() {0} {1}", (((HandlerController) controller).Client), gameAccount);
}
}
break;
default:
Logger.Warn("Received an unhandled Presence.Unsubscribe request with type {0} (0x{1})",
request.EntityId.GetHighIdType(), request.EntityId.High.ToString("X16"));
break;
}
var builder = NoData.CreateBuilder();
done(builder.Build());
}
public override void Update(IRpcController controller, UpdateRequest request, Action<NoData> done)
{
//4,1
//4,2
switch (request.EntityId.GetHighIdType())
{
case EntityIdHelper.HighIdType.AccountId:
{
if (request.EntityId.Low <= 0) break;
var gameAccount = AccountManager.GetAccountByPersistentID(request.EntityId.Low);
if (gameAccount == null) break;
var traceData = $"Update() {(((HandlerController)controller).Client)} {gameAccount} - {request.FieldOperationCount} Operations";
foreach (var fieldOp in request.FieldOperationList)
{
traceData += $"\t{(FieldKeyHelper.Program)fieldOp.Field.Key.Program}, {(FieldKeyHelper.OriginatingClass)fieldOp.Field.Key.Group}, {fieldOp.Field.Key.Field}";
}
gameAccount.Update(request.FieldOperationList);
Logger.MethodTrace(traceData);
}
break;
case EntityIdHelper.HighIdType.GameAccountId:
{
if (request.EntityId.Low <= 0) break;
var gameAccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low);
if (gameAccount == null) break;
var traceData =
$"Update() {(((HandlerController) controller).Client)} {gameAccount} - {request.FieldOperationCount} Operations";
foreach (var fieldOp in request.FieldOperationList)
{
traceData +=
$"\t{(FieldKeyHelper.Program)fieldOp.Field.Key.Program}, {(FieldKeyHelper.OriginatingClass)fieldOp.Field.Key.Group}, {fieldOp.Field.Key.Field}";
}
gameAccount.Update(request.FieldOperationList);
Logger.MethodTrace(traceData);
break;
}
default:
Logger.Warn("Received an unhandled Presence.Update request with type {0} (0x{1})",
request.EntityId.GetHighIdType(), request.EntityId.High.ToString("X16"));
break;
}
var builder = NoData.CreateBuilder();
done(builder.Build());
}
}
}