public static PlayerInfo AddFakeEntry([NotNull] string name, RankChangeType rankChangeType) { if (name == null) { throw new ArgumentNullException("name"); } CheckIfLoaded(); PlayerInfo info; lock ( AddLocker ) { info = Trie.Get(name); if (info != null) { throw new ArgumentException("A PlayerDB entry already exists for this name.", "name"); } var e = new PlayerInfoCreatingEventArgs(name, IPAddress.None, RankManager.DefaultRank, true); PlayerInfo.RaiseCreatingEvent(e); if (e.Cancel) { throw new OperationCanceledException("Cancelled by a plugin."); } info = new PlayerInfo(name, e.StartingRank, false, rankChangeType); list.Add(info); Trie.Add(info.Name, info); UpdateCache(); } PlayerInfo.RaiseCreatedEvent(info, false); return(info); }
public static PlayerInfo FindOrCreateInfoForPlayer([NotNull] string name, [NotNull] IPAddress lastIP) { if (name == null) { throw new ArgumentNullException("name"); } if (lastIP == null) { throw new ArgumentNullException("lastIP"); } CheckIfLoaded(); PlayerInfo info; // this flag is used to avoid executing PlayerInfoCreated event in the lock bool raiseCreatedEvent = false; lock (AddLocker) { info = Trie.Get(name); if (info == null) { var e = new PlayerInfoCreatingEventArgs(name, lastIP, RankManager.DefaultRank, false); PlayerInfo.RaiseCreatingEvent(e); if (e.Cancel) { throw new OperationCanceledException("Cancelled by a plugin."); } info = new PlayerInfo(name, lastIP, e.StartingRank); Trie.Add(name, info); list.Add(info); UpdateCache(); raiseCreatedEvent = true; } } if (raiseCreatedEvent) { PlayerInfo.RaiseCreatedEvent(info, false); } return(info); }
public static PlayerInfo FindOrCreateInfoForPlayer([NotNull] string givenName, [NotNull] IPAddress lastIP) { if (givenName == null) { throw new ArgumentNullException("givenName"); } if (lastIP == null) { throw new ArgumentNullException("lastIP"); } CheckIfLoaded(); PlayerInfo info; // this flag is used to avoid raising PlayerInfoCreated event inside the lock bool raiseCreatedEvent = false; bool isEmail = false; string name = givenName; // handle email accounts if (name.Contains('@')) { isEmail = true; name = EmailToPlayerName(name); } lock ( AddLocker ) { if (isEmail) { // special treatment for email accounts int i = 1; while (true) { string newName = name + (i > 1 ? ("@" + i) : "@"); info = Trie.Get(newName); if (info == null) { // found a new player, not in the database name = newName; break; } else if (givenName.CaselessEquals(info.Email)) { // player with matching email found return(info); } else { // increment number and retry i++; if ((name + "@" + i).Length > 16) { name = name.Substring(0, name.Length - 1); } } } } else { info = Trie.Get(name); } if (info == null) { var e = new PlayerInfoBeingCreatedEventArgs(name, lastIP, RankManager.DefaultRank, false); PlayerInfo.RaiseCreatingEvent(e); if (e.Cancel) { throw new OperationCanceledException("Cancelled by a plugin."); } info = new PlayerInfo(name, lastIP, e.StartingRank); if (isEmail) { info.Email = givenName; info.AccountType = AccountType.Free; } Trie.Add(name, info); list.Add(info); UpdateCache(); raiseCreatedEvent = true; } } if (raiseCreatedEvent) { PlayerInfo.RaiseCreatedEvent(info, false); } return(info); }