Example #1
0
        public async Task Process(Login login)
        {
            var ret = await Task.Run(() => server.LoginChecker.DoLogin(login, RemoteEndpointIP, login.Dlc));

            if (ret.LoginResponse.ResultCode == LoginResponse.Code.Ok)
            {
                var user = ret.User;
                //Trace.TraceInformation("{0} login: {1}", this, response.ResultCode.Description());

                await this.SendCommand(user); // send self to self first

                connectedUser      = server.ConnectedUsers.GetOrAdd(user.Name, (n) => new ConnectedUser(server, user));
                connectedUser.User = user;
                connectedUser.Connections.TryAdd(this, true);

                // close other connections
                foreach (var otherConnection in connectedUser.Connections.Keys.Where(x => x != null && x != this).ToList())
                {
                    otherConnection.RequestClose();
                    bool oth;
                    connectedUser.Connections.TryRemove(otherConnection, out oth);
                }

                server.SessionTokens[ret.LoginResponse.SessionToken] = user.AccountID;

                await SendCommand(ret.LoginResponse); // login accepted

                connectedUser.ResetHasSeen();


                foreach (var b in server.Battles.Values.Where(x => x != null))
                {
                    await SendCommand(new BattleAdded()
                    {
                        Header = b.GetHeader()
                    });
                }

                // mutually syncs users based on visibility rules
                await server.TwoWaySyncUsers(Name, server.ConnectedUsers.Keys);


                server.OfflineMessageHandler.SendMissedMessagesAsync(this, SayPlace.User, Name, user.AccountID);

                var defChans = await server.ChannelManager.GetDefaultChannels(user.AccountID);

                defChans.AddRange(server.Channels.Where(x => x.Value.Users.ContainsKey(user.Name)).Select(x => x.Key)); // add currently connected channels to list too

                foreach (var chan in defChans.ToList().Distinct())
                {
                    await connectedUser.Process(new JoinChannel()
                    {
                        ChannelName = chan,
                        Password    = null
                    });
                }


                foreach (var bat in server.Battles.Values.Where(x => x != null && x.IsInGame))
                {
                    var s = bat.spring;
                    if (s.LobbyStartContext.Players.Any(x => !x.IsSpectator && x.Name == Name) && !s.Context.ActualPlayers.Any(x => x.Name == Name && x.LoseTime != null))
                    {
                        await SendCommand(new RejoinOption()
                        {
                            BattleID = bat.BattleID
                        });
                    }
                }


                await SendCommand(new FriendList()
                {
                    Friends = connectedUser.FriendEntries.ToList()
                });
                await SendCommand(new IgnoreList()
                {
                    Ignores = connectedUser.Ignores.ToList()
                });

                await server.MatchMaker.OnLoginAccepted(connectedUser);

                await server.PlanetWarsMatchMaker.OnLoginAccepted(connectedUser);

                await SendCommand(server.NewsListManager.GetCurrentNewsList());
                await SendCommand(server.LadderListManager.GetCurrentLadderList());
                await SendCommand(server.ForumListManager.GetCurrentForumList(user.AccountID));

                using (var db = new ZkDataContext())
                {
                    var acc = db.Accounts.Find(user.AccountID);
                    if (acc != null)
                    {
                        await server.PublishUserProfileUpdate(acc);
                    }
                }
            }
            else
            {
                await SendCommand(ret.LoginResponse);

                if (ret.LoginResponse.ResultCode == LoginResponse.Code.Banned)
                {
                    await Task.Delay(500); // this is needed because socket writes are async and might not be queued yet

                    await transport.Flush();

                    transport.RequestClose();
                }
            }
        }
Example #2
0
        public async Task Process(JoinChannel joinChannel)
        {
            if (!IsLoggedIn)
            {
                return;
            }

            if (!await server.ChannelManager.CanJoin(User.AccountID, joinChannel.ChannelName))
            {
                await
                SendCommand(new JoinChannelResponse()
                {
                    Success     = false,
                    Reason      = "you don't have permission to join this channel",
                    ChannelName = joinChannel.ChannelName
                });

                return;
            }

            var channel = server.Channels.GetOrAdd(joinChannel.ChannelName, (n) => new Channel()
            {
                Name = joinChannel.ChannelName,
            });

            if (!string.IsNullOrEmpty(channel.Password) && (channel.Password != joinChannel.Password))
            {
                await SendCommand(new JoinChannelResponse()
                {
                    Success = false, Reason = "invalid password", ChannelName = joinChannel.ChannelName
                });

                return;
            }

            var added = channel.Users.TryAdd(Name, User);

            if (!added)
            {
                await
                SendCommand(new JoinChannelResponse()
                {
                    Success     = false,
                    Reason      = "You are already in this channel",
                    ChannelName = joinChannel.ChannelName
                });

                return;
            }
            var visibleUsers = !channel.IsDeluge ? channel.Users.Keys.ToList() : channel.Users.Keys.Where(x => server.CanUserSee(Name, x)).ToList();
            var canSeeMe     = !channel.IsDeluge ? channel.Users.Keys.ToList() : channel.Users.Keys.Where(x => server.CanUserSee(x, Name)).ToList();

            await server.TwoWaySyncUsers(Name, canSeeMe); // mutually sync user statuses

            // send response with the list
            await SendCommand(new JoinChannelResponse()
            {
                Success     = true,
                ChannelName = joinChannel.ChannelName,
                Channel     =
                    new ChannelHeader()
                {
                    ChannelName = channel.Name,
                    Password    = channel.Password,
                    Topic       = channel.Topic,
                    Users       = visibleUsers,   // for zk use cansee test to not send all users
                    IsDeluge    = channel.IsDeluge
                }
            });

            // send missed messages
            server.OfflineMessageHandler.SendMissedMessagesAsync(this, SayPlace.Channel, joinChannel.ChannelName, User.AccountID, channel.IsDeluge ? OfflineMessageHandler.DelugeMessageResendCount : OfflineMessageHandler.MessageResendCount);

            // send self to other users who can see
            if (added)
            {
                await server.Broadcast(canSeeMe, new ChannelUserAdded { ChannelName = channel.Name, UserName = Name });
            }
        }
Example #3
0
        public async Task Process(Login login)
        {
            var ret = await Task.Run(() => server.LoginChecker.DoLogin(login, RemoteEndpointIP));

            if (ret.LoginResponse.ResultCode == LoginResponse.Code.Ok)
            {
                var user = ret.User;
                //Trace.TraceInformation("{0} login: {1}", this, response.ResultCode.Description());

                await this.SendCommand(user); // send self to self first

                connectedUser      = server.ConnectedUsers.GetOrAdd(user.Name, (n) => new ConnectedUser(server, user));
                connectedUser.User = user;
                connectedUser.Connections.TryAdd(this, true);

                server.SessionTokens[ret.LoginResponse.SessionToken] = user.AccountID;

                await SendCommand(ret.LoginResponse); // login accepted

                connectedUser.ResetHasSeen();


                foreach (var b in server.Battles.Values.Where(x => x != null))
                {
                    await SendCommand(new BattleAdded()
                    {
                        Header = b.GetHeader()
                    });
                }

                // mutually syncs users based on visibility rules
                await server.TwoWaySyncUsers(Name, server.ConnectedUsers.Keys);


                server.OfflineMessageHandler.SendMissedMessagesAsync(this, SayPlace.User, Name, user.AccountID);

                var defChans = await server.ChannelManager.GetDefaultChannels(user.AccountID);

                defChans.AddRange(server.Channels.Where(x => x.Value.Users.ContainsKey(user.Name)).Select(x => x.Key)); // add currently connected channels to list too

                foreach (var chan in defChans.ToList().Distinct())
                {
                    await connectedUser.Process(new JoinChannel()
                    {
                        ChannelName = chan,
                        Password    = null
                    });
                }


                foreach (var bat in server.Battles.Values.Where(x => x != null && x.IsInGame))
                {
                    var s = bat.spring;
                    if (s.LobbyStartContext.Players.Any(x => !x.IsSpectator && x.Name == Name) && !s.Context.ActualPlayers.Any(x => x.Name == Name && x.LoseTime != null))
                    {
                        await SendCommand(new RejoinOption()
                        {
                            BattleID = bat.BattleID
                        });
                    }
                }


                await SendCommand(new FriendList()
                {
                    Friends = connectedUser.FriendEntries.ToList()
                });
                await SendCommand(new IgnoreList()
                {
                    Ignores = connectedUser.Ignores.ToList()
                });

                await server.MatchMaker.OnLoginAccepted(connectedUser);

                await server.PlanetWarsMatchMaker.OnLoginAccepted(connectedUser);
            }
            else
            {
                await SendCommand(ret.LoginResponse);

                if (ret.LoginResponse.ResultCode == LoginResponse.Code.Banned)
                {
                    transport.RequestClose();
                }
            }
        }