Jump to content

Smurf tag.


Emperior
 Share

Recommended Posts

8 hours ago, Stan` said:

I have 7 email accounts. Makes it harder not impossible. Also lots of legalese.

I'm not sure I understand you.

 

I have, basically, infinite accounts due to forwarding certain domains to my a primary email address.  Have tons of accounts such as amazon@???.com, target@???.com, orangebank@???.com ... etc.

Not really sure emails are unique.

Edited by Dizaka
Link to comment
Share on other sites

54 minutes ago, Dizaka said:

I have, basically, infinite accounts due to forwarding certain domains to my a primary email address.  Have tons of accounts such as amazon@???.com, target@???.com, orangebank@???.com ... etc.

Not really sure emails are unique.

what else could be taken from players? I think phone numbers are too much to ask for even tho some games ask for user phone # to link to users accounts:wink1:

  • Thanks 1
Link to comment
Share on other sites

1 hour ago, go2die said:

Answer is there is/was bad interpretation on players name containing specific character which causes substraction of rating due to failure of lookup in player db. Only few accounts are affected. I hope this noon developer answer satisfy you...I can use wildfires search .... Nub

Fix here waiting for review by @user1

https://github.com/0ad/lobby-bots/pull/10
Link to comment
Share on other sites

4 hours ago, Stan` said:

Fix here waiting for review by @user1

https://github.com/0ad/lobby-bots/pull/10

Actually reviews by everybody who feels confident assessing the changes of such PRs are appreciated.

I'll also soon merge this and some of the other PRs, no matter if somebody looked at them or not, as otherwise the development of the bots is blocked too much by waiting.

Please mind that merging this PR won't result in the bug being fixed in the actually lobby immediately, as the bots running there have to be updated to use the new code and that might still take a while until we have a better process for that.

Link to comment
Share on other sites

9 hours ago, rossenburg said:

what else could be taken from players? I think phone numbers are too much to ask for even tho some games ask for user phone # to link to users accounts:wink1:

I'm not completely sure.

Maybe a taking a phone number but using a 1-way hash on it?  This way it isn't "used" but it is fairly unique.

Edited by Dizaka
Link to comment
Share on other sites

1 hour ago, Dunedan said:

Actually reviews by everybody who feels confident assessing the changes of such PRs are appreciated.

ILIKE is obviously wrong, you want the sql '=' for the WHERE here, can't comment on the python part thou, but looks approximately right ;)

 

Link to comment
Share on other sites

Easiest solution, like @Darkcity proposed: show total number of games played in the lobby INCLUDING non 1v1 games, then date of account creation relative to GMT +0:00

Rating is not important, what's important is to see that the person is experienced, i.e. not cosmic. Examples of where ratings are completely useless: reza-math, FUBAR, SaidRdz

If an account is new, then they are either a smurf or a cosmic, so they will not be allowed into 4v4 games. 

If an old player is returning, we would be able to tell from the date of account creation and the total number of games they played. 

As someone who has attempted smurfing a dozen times I can tell you the following:

1. Making a new email address is not a difficult task and will not require one to spend any money. 

2. In some countries one can buy a new SIM card and hence a new phone number for very low prices. 

3. Lobby bans can be bypassed, not very easily but quite do-able. 

4. Smurf speculators guess correctly around 50% of the time. 

  • Like 1
Link to comment
Share on other sites

1 hour ago, Darkcity said:

@Stan` How can i get account creation date and total games played (including non rated)? Do we have such info in out database or we don't save it at all?

 

There are such info, when registering a user there's something like 

Quote
 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

which should save the date the user made the account. And about the total number of games played, that is again possible. You can check ProfilePanel.js. Send me a pm if you have problem with it, can help you work around it

  • Thanks 1
Link to comment
Share on other sites

1 hour ago, rossenburg said:

which should save the date the user made the account. And about the total number of games played, that is again possible. You can check ProfilePanel.js. Send me a pm if you have problem with it, can help you work around it

Is this information saved passed onto all of the clients (players) looking at this profile, or, is it  stored only on a central location which the players do not have access rights to?

 

Link to comment
Share on other sites

@rossenburg this is my ProfilePage.js Am I looking at the correct file? If so, which line should I change?

 

	/**
 * The profile page enables the player to lookup statistics of an arbitrary player.
 */
class ProfilePage
{
	constructor(xmppMessages)
	{
		this.requestedPlayer = undefined;
		this.closePageHandlers = new Set();

		this.profilePage = Engine.GetGUIObjectByName("profilePage");

		this.fetchInput = Engine.GetGUIObjectByName("fetchInput");
		this.fetchInput.onPress = this.onPressLookup.bind(this);

		Engine.GetGUIObjectByName("viewProfileButton").onPress = this.onPressLookup.bind(this);
		Engine.GetGUIObjectByName("profileBackButton").onPress = this.onPressClose.bind(this, true);

		this.profilePlayernameText = Engine.GetGUIObjectByName("profilePlayernameText");
		this.profileRankText = Engine.GetGUIObjectByName("profileRankText");
		this.profileHighestRatingText = Engine.GetGUIObjectByName("profileHighestRatingText");
		this.profileTotalGamesText = Engine.GetGUIObjectByName("profileTotalGamesText");
		this.profileWinsText = Engine.GetGUIObjectByName("profileWinsText");
		this.profileLossesText = Engine.GetGUIObjectByName("profileLossesText");
		this.profileRatioText = Engine.GetGUIObjectByName("profileRatioText");
		this.profileErrorText = Engine.GetGUIObjectByName("profileErrorText");
		this.profileWindowArea = Engine.GetGUIObjectByName("profileWindowArea");

		xmppMessages.registerXmppMessageHandler("game", "profile", this.onProfile.bind(this));
	}

	registerClosePageHandler(handler)
	{
		this.closePageHandlers.add(handler);
	}

	openPage()
	{
		this.profilePage.hidden = false;
		Engine.SetGlobalHotkey("cancel", "Press", this.onPressClose.bind(this));
	}

	onPressLookup()
	{
		this.requestedPlayer = this.fetchInput.caption;
		Engine.SendGetProfile(this.requestedPlayer);
	}

	onPressClose()
	{
		this.profilePage.hidden = true;

		for (let handler of this.closePageHandlers)
			handler();
	}

	onProfile()
	{
		let attributes = Engine.GetProfile()[0];
		if (this.profilePage.hidden || this.requestedPlayer != attributes.player)
			return;

		let profileFound = attributes.rating != "-2";
		this.profileWindowArea.hidden = !profileFound;
		this.profileErrorText.hidden = profileFound;

		if (!profileFound)
		{
			this.profileErrorText.caption =
				sprintf(translate("Player \"%(nick)s\" not found."), {
					"nick": escapeText(attributes.player)
				});
			return;
		}

		this.profilePlayernameText.caption = escapeText(attributes.player);
		this.profileRankText.caption = attributes.rank;
		this.profileHighestRatingText.caption = attributes.highestRating;
		this.profileTotalGamesText.caption = attributes.totalGamesPlayed;
		this.profileWinsText.caption = attributes.wins;
		this.profileLossesText.caption = attributes.losses;
		this.profileRatioText.caption = ProfilePanel.FormatWinRate(attributes);
	}
}

 

Link to comment
Share on other sites

1 hour ago, Sevda said:

@rossenburg this is my ProfilePage.js Am I looking at the correct file? If so, which line should I change?

 

	/**
 * The profile page enables the player to lookup statistics of an arbitrary player.
 */
class ProfilePage
{
	constructor(xmppMessages)
	{
		this.requestedPlayer = undefined;
		this.closePageHandlers = new Set();

		this.profilePage = Engine.GetGUIObjectByName("profilePage");

		this.fetchInput = Engine.GetGUIObjectByName("fetchInput");
		this.fetchInput.onPress = this.onPressLookup.bind(this);

		Engine.GetGUIObjectByName("viewProfileButton").onPress = this.onPressLookup.bind(this);
		Engine.GetGUIObjectByName("profileBackButton").onPress = this.onPressClose.bind(this, true);

		this.profilePlayernameText = Engine.GetGUIObjectByName("profilePlayernameText");
		this.profileRankText = Engine.GetGUIObjectByName("profileRankText");
		this.profileHighestRatingText = Engine.GetGUIObjectByName("profileHighestRatingText");
		this.profileTotalGamesText = Engine.GetGUIObjectByName("profileTotalGamesText");
		this.profileWinsText = Engine.GetGUIObjectByName("profileWinsText");
		this.profileLossesText = Engine.GetGUIObjectByName("profileLossesText");
		this.profileRatioText = Engine.GetGUIObjectByName("profileRatioText");
		this.profileErrorText = Engine.GetGUIObjectByName("profileErrorText");
		this.profileWindowArea = Engine.GetGUIObjectByName("profileWindowArea");

		xmppMessages.registerXmppMessageHandler("game", "profile", this.onProfile.bind(this));
	}

	registerClosePageHandler(handler)
	{
		this.closePageHandlers.add(handler);
	}

	openPage()
	{
		this.profilePage.hidden = false;
		Engine.SetGlobalHotkey("cancel", "Press", this.onPressClose.bind(this));
	}

	onPressLookup()
	{
		this.requestedPlayer = this.fetchInput.caption;
		Engine.SendGetProfile(this.requestedPlayer);
	}

	onPressClose()
	{
		this.profilePage.hidden = true;

		for (let handler of this.closePageHandlers)
			handler();
	}

	onProfile()
	{
		let attributes = Engine.GetProfile()[0];
		if (this.profilePage.hidden || this.requestedPlayer != attributes.player)
			return;

		let profileFound = attributes.rating != "-2";
		this.profileWindowArea.hidden = !profileFound;
		this.profileErrorText.hidden = profileFound;

		if (!profileFound)
		{
			this.profileErrorText.caption =
				sprintf(translate("Player \"%(nick)s\" not found."), {
					"nick": escapeText(attributes.player)
				});
			return;
		}

		this.profilePlayernameText.caption = escapeText(attributes.player);
		this.profileRankText.caption = attributes.rank;
		this.profileHighestRatingText.caption = attributes.highestRating;
		this.profileTotalGamesText.caption = attributes.totalGamesPlayed;
		this.profileWinsText.caption = attributes.wins;
		this.profileLossesText.caption = attributes.losses;
		this.profileRatioText.caption = ProfilePanel.FormatWinRate(attributes);
	}
}

 

what do you intend doing?

 

Link to comment
Share on other sites

I was thinking of a comprehesive solution for taking care of smurfs. Along with reporting and tagging. Player can have idea about the smurf through following logic.

Identifying smurfs: This will require 3 main inputs: Creation Date, Total Games played, and local rating. The reporting will fall in multiple smurf likelyhoods, we can say these are smurf levels, where 1 being highest and 5 being lowest likelyhood.

  1. Creation Date <= 7 days.  Total game played <=10, and Local rating > +50. or Total game played >10, and Local rating > +40. 
  2. 7 days < Creation Date <= 1 month.  Total game played >10, and Local rating > +40. 
  3. 1 month < Creation Date <= 3 months. Total games played <=20, and Local rating > +40.
  4. 1 month < Creation Date <= 3 months. Total games played > 20, and Local rating > +35.
  5. Creation Date > 3 months. Total games played > 30, and Local rating > +35.

These are just rules through which a player can identify and report. We can implement it along with @rossenburg smurf tagging solution and let hosted player know their smurf level. Or, we can just inform player to check these details if they don't know the player.

Note: This is specific to player, as they rely on local rating and additional info which we will provide like creation date and total games played. These numbers can be adjusted as we may see fit.

@rossenburg Let us know if you figure out how we can access total games played and creation date. Thanks in advance.

CC: @Sevda

Edited by Darkcity
  • Like 1
Link to comment
Share on other sites

22 minutes ago, Darkcity said:

I was thinking of a comprehesive solution for taking care of smurfs. Along with reporting and tagging. Player can have idea about the smurf through following logic.

Identifying smurfs: This will require 3 main inputs: Creation Date, Total Games played, and local rating. The reporting will fall in multiple smurf likelyhoods, we can say these are smurf levels, where 1 being highest and 5 being lowest likelyhood.

  1. Creation Date <= 7 days.  Total game played <=10, and Local rating > +50. or Total game played >10, and Local rating > +40. 
  2. 7 days < Creation Date <= 1 month.  Total game played >10, and Local rating > +40. 
  3. 1 month < Creation Date <= 3 months. Total games played <=20, and Local rating > +40.
  4. 1 month < Creation Date <= 3 months. Total games played > 20, and Local rating > +35.
  5. Creation Date > 3 months. Total games played > 30, and Local rating > +35.

These are just rules through which a player can identify and report. We can implement it along with @rossenburg smurf tagging solution and let hosted player know their smurf level. Or, we can just inform player to check these details if they don't know the player.

Note: This is specific to player, as they rely on local rating and additional info which we will provide like creation date and total games played. These numbers can be adjusted as we may see fit.

@rossenburg Let us know if you figure out how we can access total games played and creation date. Thanks in advance.

CC: @Sevda

@Darkcity if im right, the other time you were talking about the "TotalGames" not related to just the ones that is recorded for 1v1 matches but overall games including TG, 2v2 etc. yeah? I don't think there is such data ( summation of all total games played including TG and other games ), and its less likely to record those data since its not completely necessary because some players prefer to play with bots and all that. But i want to say this can be implemented into a mod where whenever a match is started by a player ( all aspect or maybe if players != bot ), It gets counted simply by adding a +1. but one problem is that, even if we are able to get this working, all players including the currently smurf will be the same level since all will start from 0 matches played or maybe + the alerady total number of games played (1v1). Just like how local rating works, these info will be saved locally

  Engine.ConfigDB_WriteValueToFile

and displayed to people who has the same mod. So i guess we can join forces and figure out a way to make a mod for this and update it progressively whenever there's new idea or logics. I'm pretty sure it will work out well. Aside that, since everything is saved locally, someone can just decide to open the file, edit it and that wont be fair too :/

Link to comment
Share on other sites

I see. Thanks @rossenburg. Local storgae is not a good idea, it will only allow sumrf to find a way around. 

@Stan` Can we atleast save account creation dates for the player? I can think of following use cases for storing these field.

  1. Identifying players experience in games - This is for players.
  2. Data analytics for 0ad: It can be used both for historical data analysis as well as some for good GTM for alphas.
    1. Player retention - example old players returning in new alpha
    2. Player acquisition - New users signing up
    3. Fake account identified - More clean data
    4. Account creation behaviour over time
    5. Release in season when accounts are created the most.

      i can add more use case but get the point.

For # of game played, it is not as imporant as compared to account creation date, but if it can be added with @rossenburg  if any player is AI Bot don't count else count. It can be considered if possible.

Meanwhile I think we can mod the smurf reporting piece. @rossenburg I would love to check your mod once completed. If need any input from somewhere then PM me. @Sevda let us know if you want to add anything.

 

Link to comment
Share on other sites

@DarkcityI like your method of ranking smurfs, it will reduce the chance of wrong accusations.

Problem: local ratings is just a number, sometimes it may be biased or anomalous. I would look closer at micro, eco and general playstyle instead of catching people out based on a single number. In addition, many players do not use local ratings nor would they have enough data for accurate ratings.

  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...