private async Task HandleAllianceChat(IClient client, Message message, CancellationToken cancellationToken) { var acMessage = (AllianceChatMessage)message; var level = client.Session.Level; var clan = level.Avatar.Alliance; if (clan == null) { Server.Logs.Warn("A client tried to send a chat message to a clan, but himself is not in a clan."); } else { var member = clan.Get(level.Avatar.Id); if (member == null) { Server.Logs.Warn("A client tried to sent a chat message to a clan, but wasn't not in the clan."); } else { var caStreamEntry = clan.Chat(level.Avatar.Id, acMessage.MessageText); Debug.Assert(caStreamEntry != null); var clanSave = Server.Factories.GetFactory <ClanSaveFactory>().Create(); clanSave.FromClan(clan); await Server.Db.SaveClanAsync(clanSave, cancellationToken); //TODO: Handle this stuff with the ChatManager. // Send this message to all the clients online who are in the clans. foreach (var c in Server.Clients) { // Send an alliance stream event to client. var aseMessage = new AllianceStreamEventMessage { Entry = caStreamEntry }; if (c?.Session.Level?.Avatar?.Alliance != null) { var cclan = c.Session.Level.Avatar.Alliance; if (cclan.Id == clan.Id) { c.SendMessage(aseMessage); } } } } } }
private async Task HandleLeaveAlliance(IClient client, Message message, CancellationToken cancellationToken) { var level = client.Session.Level; var clan = level.Avatar.Alliance; if (clan == null) { Server.Logs.Warn("A client tried to leave a clan, but himself is not in a clan."); } else { //TODO: Look for new leader in case leader leaves. var member = clan.Get(level.Avatar.Id); var jolStreamEntry = clan.Leave(level.Avatar.Id); if (jolStreamEntry == null) { Server.Logs.Warn("A client tried to leave a clan, but wasn't not in the clan."); } else { // Set avatar to null so that when it saves with ClanId = 0. level.Avatar.Alliance = null; var ascCommand = new AvailableServerCommandMessage { Command = new AllianceLeftCommand { ClanId = clan.Id, Reason = 1, Tick = -1 } }; client.SendMessage(ascCommand); // Set clan_id to NULL so that the FOREIGN KEY constraint does not fail. var levelSave = client.Save; await Server.Db.SaveLevelAsync(levelSave, cancellationToken); var clanSave = Server.Factories.GetFactory <ClanSaveFactory>().Create(); clanSave.FromClan(clan); await Server.Db.SaveClanAsync(clanSave, cancellationToken); // Send this message to all the clients online who are in the clans. foreach (var c in Server.Clients) { // Send an alliance stream event to client. var aseMessage = new AllianceStreamEventMessage { Entry = jolStreamEntry }; if (c?.Session.Level?.Avatar?.Alliance != null) { var cclan = c.Session.Level.Avatar.Alliance; if (cclan.Id == clan.Id) { c.SendMessage(aseMessage); } } } } } }
private async Task HandleJoinAlliance(IClient client, Message message, CancellationToken cancellationToken) { var jaMessage = (JoinAllianceMessage)message; var clan = await Server.Clans.GetClanAsync(jaMessage.ClanId, cancellationToken); var level = client.Session.Level; if (clan == null) { Server.Logs.Warn("Client tried to join a clan that does not exists."); } else { var jolStreamEntry = clan.Join(level.Avatar); if (jolStreamEntry == null) { Server.Logs.Warn("Client tried to join his own clan"); } else { client.Session.Level.Avatar.Alliance = clan; var asMessage = clan.AllianceStream; var ascMessage = new AvailableServerCommandMessage { Command = new AllianceJoinedCommand { ClanId = clan.Id, Name = clan.Name, Badge = clan.Badge, ExpLevels = clan.ExpLevels, Tick = -1 } }; client.SendMessage(ascMessage); client.SendMessage(asMessage); await Server.Db.SaveLevelAsync(client.Save, cancellationToken); // Send this message to all the clients online who are in the clans. foreach (var c in Server.Clients) { // Send an alliance stream event to client. var aseMessage = new AllianceStreamEventMessage { Entry = jolStreamEntry }; if (c?.Session.Level?.Avatar?.Alliance != null) { var cclan = c.Session.Level.Avatar.Alliance; if (cclan.Id == clan.Id) { c.SendMessage(aseMessage); } } } } } }