private string IncomingList(Session session, string[] parms) { bool help = false; string tribeName = string.Empty; try { var p = new OptionSet { { "?|help|h", v => help = true }, { "tribe=", v => tribeName = v.TrimMatchingQuotes() }, }; p.Parse(parms); } catch (Exception) { help = true; } if (help || string.IsNullOrEmpty(tribeName)) { return("TribesmanRemove --tribe=tribe_name"); } uint tribeId; if (!tribeManager.FindTribeId(tribeName, out tribeId)) { return("Tribe not found"); } ITribe tribe; StringBuilder result = new StringBuilder("Incomings:\n"); locker.Lock(tribeId, out tribe).Do(() => { foreach (var incoming in tribeManager.GetIncomingList(tribe)) { result.Append(string.Format("To [{0}-{1}] From[{2}] Arrival Time[{3}]\n", incoming.Target.LocationType, incoming.Target.LocationId, incoming.Source.LocationId, incoming.EndTime)); } }); return(result.ToString()); }
public void Confirm(Session session, Packet packet) { bool isAccepting; try { isAccepting = packet.GetByte() != 0; } catch (Exception) { ReplyError(session, packet, Error.Unexpected); return; } ITribe tribe = null; locker.Lock(session.Player).Do(() => { if (session.Player.TribeRequest == 0) { ReplyError(session, packet, Error.TribesmanNoRequest); return; } var tribeRequestId = session.Player.TribeRequest; session.Player.TribeRequest = 0; dbManager.Save(session.Player); if (!isAccepting) { ReplySuccess(session, packet); return; } if (!world.TryGetObjects(tribeRequestId, out tribe)) { ReplyError(session, packet, Error.TribeNotFound); } }); if (tribe == null) { return; } locker.Lock(session.Player, tribe).Do(() => { if (tribe == null) { ReplyError(session, packet, Error.Unexpected); return; } var tribesman = new Tribesman(tribe, session.Player, tribe.DefaultRank); var error = tribe.AddTribesman(tribesman); if (error != Error.Ok) { ReplyError(session, packet, error); return; } var reply = new Packet(packet); reply.AddInt32(tribeManager.GetIncomingList(tribe).Count()); reply.AddInt16(tribe.AssignmentCount); PacketHelper.AddTribeRanksToPacket(tribe, reply); session.Write(reply); }); }
private void Login(Session session, Packet packet) { IPlayer player; short clientVersion; short clientRevision; LoginHandlerMode loginMode; string playerName; string loginKey; try { clientVersion = packet.GetInt16(); clientRevision = packet.GetInt16(); loginMode = (LoginHandlerMode)packet.GetByte(); playerName = packet.GetString(); loginKey = packet.GetString(); } catch (Exception) { ReplyError(session, packet, Error.Unexpected); session.CloseSession(); return; } if (clientVersion <= Config.client_min_version && clientRevision < Config.client_min_revision) { ReplyError(session, packet, Error.ClientOldVersion); session.CloseSession(); return; } LoginResponseData loginResponseData; var loginResult = loginHandler.Login(loginMode, playerName, loginKey, out loginResponseData); if (loginResult != Error.Ok) { ReplyError(session, packet, loginResult); session.CloseSession(); return; } // If we are under admin only mode then kick out non admin if (Config.server_admin_only && loginResponseData.Player.Rights == PlayerRights.Basic) { ReplyError(session, packet, Error.UnderMaintenance); session.CloseSession(); return; } //Create the session id that will be used for the calls to the web server string sessionId; if (Config.server_admin_always && !Config.server_production) { sessionId = loginResponseData.Player.Id.ToString(CultureInfo.InvariantCulture); loginResponseData.Player.Rights = PlayerRights.Bureaucrat; } else { SHA1 sha = new SHA1CryptoServiceProvider(); byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(loginResponseData.Player.Id + Config.database_salt + DateTime.UtcNow.Ticks + Config.Random.Next())); sessionId = BitConverter.ToString(hash).Replace("-", String.Empty); } lock (loginLock) { bool newPlayer = !world.Players.TryGetValue(loginResponseData.Player.Id, out player); //If it's a new player then add him to our session if (newPlayer) { logger.Info(string.Format("Creating new player {0}({1}) IP: {2}", playerName, loginResponseData.Player.Id, session.RemoteIP)); player = playerFactory.CreatePlayer(loginResponseData.Player.Id, SystemClock.Now, SystemClock.Now, playerName, string.Empty, loginResponseData.Player.Rights, sessionId); if (!world.Players.TryAdd(player.PlayerId, player)) { session.CloseSession(); return; } } else { player.Name = playerName; } logger.Info(string.Format("Player login in {0}({1}) IP: {2}", player.Name, player.PlayerId, session.RemoteIP)); } locker.Lock(args => { var lockedPlayer = (IPlayer)args[0]; return(lockedPlayer.IsInTribe ? new ILockable[] { lockedPlayer.Tribesman.Tribe } : new ILockable[0]); }, new object[] { player }, player).Do(() => { // If someone is already connected as this player, kick them off potentially if (player.Session != null) { player.Session.CloseSession(); player.Session = null; // Kick people off who are spamming logins if (SystemClock.Now.Subtract(player.LastLogin).TotalMilliseconds < 1500) { session.CloseSession(); return; } } // Setup session references session.Player = player; player.HasTwoFactorAuthenticated = null; player.TwoFactorSecretKey = loginResponseData.Player.TwoFactorSecretKey; player.Session = session; player.SessionId = sessionId; player.Rights = loginResponseData.Player.Rights; player.LastLogin = SystemClock.Now; player.Banned = loginResponseData.Player.Banned; player.Achievements.Clear(); player.Achievements.AddRange(loginResponseData.Achievements); player.ThemePurchases.Clear(); player.ThemePurchases.AddRange(loginResponseData.ThemePurchases); dbManager.Save(player); // If player was banned then kick his ass out if (loginResponseData.Player.Banned) { ReplyError(session, packet, Error.Banned); session.CloseSession(); return; } var reply = new Packet(packet); reply.Option |= (ushort)Packet.Options.Compressed; reply.AddString(Config.welcome_motd); //Player Info reply.AddUInt32(player.PlayerId); reply.AddString(player.PlayerHash); reply.AddUInt32(player.TutorialStep); reply.AddBoolean(player.SoundMuted); reply.AddBoolean(player.Rights >= PlayerRights.Admin); reply.AddString(sessionId); reply.AddString(player.Name); reply.AddInt32(Config.newbie_protection); reply.AddInt32(loginResponseData.Player.Balance); reply.AddUInt32(UnixDateTime.DateTimeToUnix(player.Created.ToUniversalTime())); reply.AddInt32(player.Tribesman == null ? 0 : tribeManager.GetIncomingList(player.Tribesman.Tribe).Count()); reply.AddInt16((short)(player.Tribesman == null ? 0 : player.Tribesman.Tribe.AssignmentCount)); //Server time reply.AddUInt32(UnixDateTime.DateTimeToUnix(DateTime.UtcNow.ToUniversalTime())); //Server rate reply.AddString(Config.seconds_per_unit.ToString(CultureInfo.InvariantCulture)); // If it's a new player we send simply a 1 which means the client will need to send back a city name // Otherwise, we just send the whole login info if (player.GetCityCount() == 0) { reply.AddByte(1); } else { reply.AddByte(0); PacketHelper.AddLoginToPacket(session, themeManager, reply); SubscribeDefaultChannels(session, session.Player); } session.Write(reply); // Restart any city actions that may have been stopped due to inactivity foreach (var city in player.GetCityList() .Where(city => city.Worker.PassiveActions.Values.All(x => x.Type != ActionType.CityPassive))) { city.Worker.DoPassive(city, actionFactory.CreateCityPassiveAction(city.Id), false); } }); }
public static void AddTribeInfo(IStrongholdManager strongholdManager, ITribeManager tribeManager, Session session, ITribe tribe, Packet packet) { if (session.Player.IsInTribe && tribe.Id == session.Player.Tribesman.Tribe.Id) { packet.AddByte(1); packet.AddUInt32(tribe.Id); packet.AddUInt32(tribe.Owner.PlayerId); packet.AddByte(tribe.Level); packet.AddString(tribe.Name); packet.AddString(tribe.Description); packet.AddString(tribe.PublicDescription); packet.AddFloat((float)tribe.VictoryPoint); packet.AddUInt32(UnixDateTime.DateTimeToUnix(tribe.Created)); AddToPacket(tribe.Resource, packet); packet.AddInt16((short)tribe.Count); foreach (var tribesman in tribe.Tribesmen) { packet.AddUInt32(tribesman.Player.PlayerId); packet.AddString(tribesman.Player.Name); packet.AddInt32(tribesman.Player.GetCityCount()); packet.AddByte(tribesman.Rank.Id); packet.AddUInt32(tribesman.Player.IsLoggedIn ? 0 : UnixDateTime.DateTimeToUnix(tribesman.Player.LastLogin)); AddToPacket(tribesman.Contribution, packet); } // Incoming List var incomingList = tribeManager.GetIncomingList(tribe).ToList(); packet.AddInt16((short)incomingList.Count()); foreach (var incoming in incomingList) { AddToPacket(incoming.Target, packet); AddToPacket(incoming.Source, packet); packet.AddUInt32(UnixDateTime.DateTimeToUnix(incoming.EndTime.ToUniversalTime())); } // Assignment List packet.AddInt16(tribe.AssignmentCount); foreach (var assignment in tribe.Assignments) { AddToPacket(assignment, packet); } // Strongholds var strongholds = strongholdManager.StrongholdsForTribe(tribe).ToList(); packet.AddInt16((short)strongholds.Count); foreach (var stronghold in strongholds) { packet.AddUInt32(stronghold.ObjectId); packet.AddString(stronghold.Name); packet.AddByte((byte)stronghold.StrongholdState); packet.AddByte(stronghold.Lvl); packet.AddFloat((float)stronghold.Gate); packet.AddInt32(stronghold.GateMax); packet.AddUInt32(stronghold.PrimaryPosition.X); packet.AddUInt32(stronghold.PrimaryPosition.Y); packet.AddInt32(stronghold.Troops.StationedHere().Sum(x => x.Upkeep)); packet.AddFloat((float)stronghold.VictoryPointRate); packet.AddUInt32(UnixDateTime.DateTimeToUnix(stronghold.DateOccupied.ToUniversalTime())); packet.AddUInt32(stronghold.GateOpenTo == null ? 0 : stronghold.GateOpenTo.Id); packet.AddString(stronghold.GateOpenTo == null ? string.Empty : stronghold.GateOpenTo.Name); if (stronghold.GateBattle != null) { packet.AddByte(1); packet.AddUInt32(stronghold.GateBattle.BattleId); } else if (stronghold.MainBattle != null) { packet.AddByte(2); packet.AddUInt32(stronghold.MainBattle.BattleId); } else { packet.AddByte(0); } } // Attackable Strongholds strongholds = strongholdManager.OpenStrongholdsForTribe(tribe).ToList(); packet.AddInt16((short)strongholds.Count); foreach (var stronghold in strongholds) { packet.AddUInt32(stronghold.ObjectId); packet.AddString(stronghold.Name); packet.AddUInt32(stronghold.Tribe == null ? 0 : stronghold.Tribe.Id); packet.AddString(stronghold.Tribe == null ? string.Empty : stronghold.Tribe.Name); packet.AddByte((byte)stronghold.StrongholdState); packet.AddByte(stronghold.Lvl); packet.AddUInt32(stronghold.PrimaryPosition.X); packet.AddUInt32(stronghold.PrimaryPosition.Y); if (stronghold.GateBattle != null) { packet.AddByte(1); packet.AddUInt32(stronghold.GateBattle.BattleId); } else if (stronghold.MainBattle != null) { packet.AddByte(2); packet.AddUInt32(stronghold.MainBattle.BattleId); } else { packet.AddByte(0); } } } else { packet.AddByte(0); packet.AddUInt32(tribe.Id); packet.AddString(tribe.Name); packet.AddString(tribe.PublicDescription); packet.AddByte(tribe.Level); packet.AddUInt32(UnixDateTime.DateTimeToUnix(tribe.Created)); packet.AddByte((byte)tribe.Ranks.Count()); foreach (var rank in tribe.Ranks) { packet.AddString(rank.Name); } packet.AddInt16((short)tribe.Count); foreach (var tribesman in tribe.Tribesmen) { packet.AddUInt32(tribesman.Player.PlayerId); packet.AddString(tribesman.Player.Name); packet.AddInt32(tribesman.Player.GetCityCount()); packet.AddByte(tribesman.Rank.Id); } var strongholds = strongholdManager.StrongholdsForTribe(tribe).ToList(); packet.AddInt16((short)strongholds.Count); foreach (var stronghold in strongholds) { packet.AddUInt32(stronghold.ObjectId); packet.AddString(stronghold.Name); packet.AddByte(stronghold.Lvl); packet.AddUInt32(stronghold.PrimaryPosition.X); packet.AddUInt32(stronghold.PrimaryPosition.Y); } } }