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