• Hey, guest user. Hope you're enjoying NeoGAF! Have you considered registering for an account? Come join us and add your take to the daily discourse.

STEAM | July 2014-2 In his house at R'lyeh, dead Cthulhu waits dreaming

Status
Not open for further replies.

JaseC

gave away the keys to the kingdom.
Does anyone know if there is a limit to the number of items you can have in your Steam inventory at once?

There isn't, or at least there isn't one that people are liable to actually hit. There are bot/trade-exclusive accounts with thousands upon thousands of TF2/Dota 2 items.
 

swx

Member
You now have one extra chance at 7 games from Codemasters with the Humble Flash Re-Bundle!

https://www.humblebundle.com/flash

1$
Overlord
Overlord: Raising Hell DLC Overlord: Raising Hell DLC
Operation Flashpoint: Red River Operation Flashpoint: Red River
Operation Flashpoint: Dragon Rising Operation Flashpoint: Dragon Rising
Rise of the Argonauts Rise of the Argonauts

$6
DiRT Showdown DiRT Showdown
DiRT 3 DiRT 3
Overlord II Overlord II
 

Tellaerin

Member
I'd probably be the first person to die from a hundred straight hours of AssCreed rather than an MMO. :p

Alternative post: whycantiholdallthesecollectables.jpg

Now I wish I had the time and technical chops to develop a game filled with Saoirse-related collectibles. Not that there are any pics or info related to her that you probably haven't seen already, but it's the principle of the thing.
 
How often does this happen in Trackmania? and which trackmania is this

A57LMwe.jpg


and how long does it take to access the crazier levels in Canyon?
 

Speevy

Banned
You now have one extra chance at 7 games from Codemasters with the Humble Flash Re-Bundle!

https://www.humblebundle.com/flash

1$
Overlord
Overlord: Raising Hell DLC Overlord: Raising Hell DLC
Operation Flashpoint: Red River Operation Flashpoint: Red River
Operation Flashpoint: Dragon Rising Operation Flashpoint: Dragon Rising
Rise of the Argonauts Rise of the Argonauts

$6
DiRT Showdown DiRT Showdown
DiRT 3 DiRT 3
Overlord II Overlord II

why
 

JaseC

gave away the keys to the kingdom.
You now have one extra chance at 7 games from Codemasters with the Humble Flash Re-Bundle!

https://www.humblebundle.com/flash

1$
Overlord
Overlord: Raising Hell DLC Overlord: Raising Hell DLC
Operation Flashpoint: Red River Operation Flashpoint: Red River
Operation Flashpoint: Dragon Rising Operation Flashpoint: Dragon Rising
Rise of the Argonauts Rise of the Argonauts

$6
DiRT Showdown DiRT Showdown
DiRT 3 DiRT 3
Overlord II Overlord II

Codemasters should have put Dirt and Dirt 2 behind a $10 tier and watched the money roll in.
 

jshackles

Gentlemen, we can rebuild it. We have the capability to make the world's first enhanced store. Steam will be that store. Better than it was before.
There isn't, or at least there isn't one that people are liable to actually hit. There are bot/trade-exclusive accounts with thousands upon thousands of TF2 items.

Perfect, thanks. I'm thinking about building my own version of a "trashcan" bot, and adding a "Remove" button to items in people's inventory with Enhanced Steam.
Yes, there will be a secondary confirmation box, just in case.

Then, when browsing your inventory with Enhanced Steam, if the item is tradable, you can click "Remove" and it will automatically generate a trade offer to send it to the "Enhanced Steam Trash", which will be automatically accepted by the bot.

For security sake, I might start out by only enabling the button with coupons. I don't want to get in a situation where someone "accidently" deleted something and they want it back.
 

aku:jiki

Member
Oh, damn, I just lost 2 hours to Legend of Grimrock without noticing. I was into it but still not very into it at first but with some SweetFX magic to really ramp up the atmosphere, I just got sucked in. Looks a lot better and feels more tense when dark corners are really pitch black thanks to some of the SFX settings. Also discovered that the back row teammates can attack if you give them a longer weapon, game changer!
 

maneil99

Member
So I decided not to sell my eSport Case from CSGO. Its going down in value anyway and I was going to sell it to get Cage Weapons Pack #1 for Payday 2. But I ended up paying 1 key for the Weapons Pack #1 & #2 already.

So I need an eSport key to open the case? anyone know any TF2Outpost trader that is selling the key for cheap? like maybe 1 TF2 key for 1 eSport key?
Don't do iiiit, sell the case and buy a weapon, you will be better off.

Ps, work sucks
 

JaseC

gave away the keys to the kingdom.
For security sake, I might start out by only enabling the button with coupons. I don't want to get in a situation where someone "accidently" deleted something and they want it back.

Yeah, smart thinking. See: the Bill's Hat fiasco that lead to Valve disabling the ability for users to delete inventory items.
 
Oh, damn, I just lost 2 hours to Legend of Grimrock without noticing. I was into it but still not very into it at first but with some SweetFX magic to really ramp up the atmosphere, I just got sucked in. Looks a lot better and feels more tense when dark corners are really pitch black thanks to some of the SFX settings. Also discovered that the back row teammates can attack if you give them a longer weapon, game changer!

I like to keep my back row stocked with rocks and knives for throwing :p
 

Lomax

Member
That Codemasters bundle is one of the few weekly bundles I paid the full $6 for, it's a great bundle if you don't already have the games. I'd love to see them bring back more bundles this way, there's been a few that I regret passing on and some others that would make great gifts for my friends.
 

jshackles

Gentlemen, we can rebuild it. We have the capability to make the world's first enhanced store. Steam will be that store. Better than it was before.
Yeah, smart thinking. See: the Bill's Hat fiasco that lead to Valve disabling the ability for users to delete inventory items.

Yep. Of course if it's done correctly, the only thing people will notice is that the item got "sent" in their trade offer history.

But yeah, I'd like to give people an easy way to get rid of their unwanted inventory items (like coupons) without having to say "Just send it to Trashbot" since that process can be somewhat complicated for people.
 

Shadownet

Banned
You now have one extra chance at 7 games from Codemasters with the Humble Flash Re-Bundle!

https://www.humblebundle.com/flash

1$
Overlord
Overlord: Raising Hell DLC Overlord: Raising Hell DLC
Operation Flashpoint: Red River Operation Flashpoint: Red River
Operation Flashpoint: Dragon Rising Operation Flashpoint: Dragon Rising
Rise of the Argonauts Rise of the Argonauts

$6
DiRT Showdown DiRT Showdown
DiRT 3 DiRT 3
Overlord II Overlord II

And BOUGHT! :D I've been dying to play the Overlord series forever!
 

_hekk05

Banned
What yea gonna ignore us folk in Taiwan?

How typical!!!11

I'm specifically talking about singapore of course. You guys at least got blops 2 servers near your country. We didn't even get a server in our entire region.

Also, is that a Tree of Savior fanart avatar?
 

Stumpokapow

listen to the mad man
Perfect, thanks. I'm thinking about building my own version of a "trashcan" bot, and adding a "Remove" button to items in people's inventory with Enhanced Steam.
Yes, there will be a secondary confirmation box, just in case.

Then, when browsing your inventory with Enhanced Steam, if the item is tradable, you can click "Remove" and it will automatically generate a trade offer to send it to the "Enhanced Steam Trash", which will be automatically accepted by the bot.

For security sake, I might start out by only enabling the button with coupons. I don't want to get in a situation where someone "accidently" deleted something and they want it back.

Here's some Python I wrote yesterday that automagically goes through all your trade offers and rejects any trades which ask for any items, and accepts any trades which gift you items. There's enough item context information to isolate for coupons and go from there. Even if you don't use the Python, you can probably make use of the reverse engineering of the API. So this is enough code to make your own TrashBot with trade offers functionality only, basically.

One thing worth noting; sessionid cookies often have characters which require URL encoding (mine has at least one "=" symbol, for instance); don't double-encode them or the accept trades function won't work.

Code:
import requests # for HTTP requests
import bs4 # might be needed for parsing HTML at some point
import re # regular expressions
import traceback # debugging
from collections import defaultdict # because python's dictionary structure sucks
from xml.etree import ElementTree # parsing XML

# FILL IN THIS STUFF TO MAKE GO VROOM
APIKEY = "" # your API key goes here
sessionid = "" # your sessionid cookie goes here
steamLogin="" # your steam login cookie goes here

# Descriptive info for app IDs
def appName(appID):
	appID = int(appID)
	appDetails = defaultdict(str)
	appDetails[753] = "Steam"
	appDetails[440] = "Team Fortress 2"
	appDetails[620] = "Portal 2"
	appDetails[570] = "Dota 2"
	appDetails[238460] = "BattleBlock Theater"
	return appDetails[appID] if appDetails[appID] else "Unknown App" # this would be easy to hook up to an app id basis or use an API to do the lookup, but I only care for basic item info

# Descriptive info for context IDs within Steam
def contextName(appID, contextID):
	if appID=="753":
		contextID = int(contextID)
		contextDetails = defaultdict(str)
		contextDetails[1] = "Gift"
		contextDetails[3] = "Coupon"
		contextDetails[6] = "Community Item"
		contextDetails[7] = "Item Reward"
		return contextDetails[contextID] if contextDetails[contextID] else "Unknown Context"
	else:
		return "Game Item" # This is probably not true but maybe useful

# Reduces Steam market items (emoticons, backgrounds, cards) to base type:
def reduceType(marketText):
	if "Profile Background" in marketText:
		return "Profile Background"
	elif "Emoticon" in marketText:
		return "Emoticon"
	elif "Trading Card" in marketText:
		return "Trading Card"
	else:
		return marketText

def getItemsFromTradeOffers(xmldoc):
	print "Begin loading items"
	itemSet = defaultdict(list)
	#print itemSet
	try:
		itemDescriptions = xmldoc.findall("descriptions")[0].findall("message")
	except:
		print "No items, no trades"
		return itemSet

	for item in itemDescriptions:
		#print "Found item"
		try:
			appid = item.findall("appid")[0].text
			appname = appName(appid)
			classid = int(item.findall("classid")[0].text)
			instanceid = item.findall("instanceid")[0].text
			icon_url_large = item.findall("icon_url_large")[0].text
			name = item.findall("name")[0].text.encode("ascii","ignore")
			typeItem = reduceType(item.findall("type")[0].text.encode("ascii","ignore"))
			if item.findall("descriptions"):
				baseDescription = item.findall("descriptions")[0].findall("message")[0].findall("value")[0].text
				if baseDescription:
					baseDescription = baseDescription.encode("ascii","ignore")
				else:
					baseDescription = ""
			else:
				baseDescription = ""				
	
			itemSet[classid] = [appid, appname, classid, instanceid, icon_url_large, name, typeItem, baseDescription]
		except:
			print traceback.format_exc()
			print item
			pass

	return itemSet

def getNameFromUserid(userid):
	global APIKEY
	print userid
	u = requests.get("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key="+APIKEY+"&steamids="+str(userid)+"&format=xml")
	tradeXML = u.text
	xmldoc = ElementTree.fromstring(tradeXML)
	players = xmldoc.findall("players")[0].findall("player")
	if players is not None:
		if len(players[0].findall("personaname")):
			personaname = players[0].findall("personaname")[0].text
		else:
			personaname = "No username"

		if len(players[0].findall("realname")):
			realname = players[0].findall("realname")[0].text
		else:
			realname = personaname
		print "Player Info: "+personaname+" ("+realname+")"
		return 1
	else:
		print "Found no name"
		return -1


def getTradeOffers():
	global APIKEY
	# Load, read, enter into XML parser
	u = requests.get("https://api.steampowered.com/IEconService/GetTradeOffers/v0001/?key="+APIKEY+"&get_received_offers=1&get_descriptions=1&active_only=1&format=xml")
	tradeXML = u.text
	xmldoc = ElementTree.fromstring(tradeXML)

	# Pre-load item information
	itemSet = getItemsFromTradeOffers(xmldoc)

	# Parse through trades
	try:
		tradeOffers = xmldoc.findall("trade_offers_received")[0].findall("message")
	except:
		print "No trades"
		return

	for tradeOffer in tradeOffers:
		# Basic trade metadata
		tradeOfferID = tradeOffer.findall("tradeofferid")[0].text
		otherUser = int(tradeOffer.findall("accountid_other")[0].text)
		otherUser += 76561197960265728 # 32-bit steamid to 64-bit steamid conversion, python implicitly switches int to long
			
		getNameFromUserid(otherUser) # not necessary, might be useful for a log
		trade_offer_state = int(tradeOffer.findall("trade_offer_state")[0].text)
		message = tradeOffer.findall("message")[0].text

		# Processing
		print "BEGIN Trade "+tradeOfferID

		# Trade error codes
		if trade_offer_state==1:
			print "ERROR on Trade "+tradeOfferID+": Invalid"
			continue
		elif trade_offer_state==3:
			print "ERROR on Trade "+tradeOfferID+": Trade already accepted"
			continue
		elif trade_offer_state==4:
			print "ERROR on Trade "+tradeOfferID+": Counter offer"
			declineTrade(tradeOfferID)
			continue
		elif trade_offer_state==5:
			print "ERROR on Trade "+tradeOfferID+": Trade expired"
			continue
		elif trade_offer_state==6:
			print "ERROR on Trade "+tradeOfferID+": Trade cancelled"
			continue
		elif trade_offer_state==7:
			print "ERROR on Trade "+tradeOfferID+": Trade already declined"
			continue
		elif trade_offer_state==8:
			print "ERROR on Trade "+tradeOfferID+": Trade items messed up"
			continue

		# Now get details
		giveItems = tradeOffer.findall("items_to_give")
		if giveItems:
			# Right now, any trade that requests items from me gets declined
			print "ERROR on Trade "+tradeOfferID+": "+str(len(giveItems[0].findall("message")))+" items requested. Declining"
			declineOffer(tradeOfferID)
			continue
		else:
			#print "PROCESSING Trade "+tradeOfferID+": 0 items requested. Continuing."
			pass

		receiveItems = tradeOffer.findall("items_to_receive")[0]
		if receiveItems is not None:
			print "PROCESSING Trade "+tradeOfferID+": "+str(len(receiveItems.findall("message")))+" items being sent"
			itemsReceiving = receiveItems.findall("message")
			for item in itemsReceiving:
				appid = item.findall("appid")[0].text
				appname = appName(appid)
				contextid = item.findall("contextid")[0].text
				context = contextName(appid,contextid)
				assetid = item.findall("assetid")[0].text
				classid = int(item.findall("classid")[0].text)
				instanceid = item.findall("instanceid")[0].text
				amount = item.findall("amount")[0].text

				# Get Item
				print "Item: "+appid+" ("+appname+", context: "+contextid+" ["+context+"]). Class: "+str(classid)
				if len(itemSet[classid]):
					# Get better item description
					imageURL = "http://steamcommunity-a.akamaihd.net/economy/image/"+itemSet[classid][4]+"/292x136"
					
					print itemSet[classid][5]+" ("+itemSet[classid][6]+")"
				else:
					print "No better info found"

			status = acceptOffer(tradeOfferID, otherUser)
			if status==1:
				return
			else:
				continue
		else:
			print "ERROR on Trade "+tradeOfferID+": No items included. Declining"
			declineOffer(tradeOfferID)
			continue
		

# Use API to decline offer
def declineOffer(tradeOfferID):
	print "Attempting to decline "+str(tradeOfferID)
	global APIKEY
	
	data = {'key': APIKEY, 'tradeofferid': tradeOfferID}
	u = requests.post("https://api.steampowered.com/IEconService/DeclineTradeOffer/v0001/", data=data)
	response = u.read().lower()
	if "error" in response:
		print response
		return -1
	else:
		return 0

	return -1

# User scraping to accept offer
def acceptOffer(tradeOfferID, otherUser):
	global sessionid, steamLogin
	tradeOfferID = int(tradeOfferID)
	data = {'sessionid': sessionid, 'tradeofferid': tradeOfferID, 'partner': str(otherUser)}
	headers = {'referer': "http://steamcommunity.com/tradeoffer/"+str(tradeOfferID)+"/"}
	cookies = dict(sessionid=sessionid,steamLogin=steamLogin)
	r = requests.post("https://steamcommunity.com/tradeoffer/"+str(tradeOfferID)+"/accept",data=data,headers=headers,cookies=cookies)
	if r.status_code==403:
		print "Error, forbidden"
		return -1
	else:
		print r.text
		print "Accepted"
		return 1

getTradeOffers()
 
^ holy shit

It's not taking the spot of another bundle. It's something you apparently wanted because you missed it the last time. Where's the problem?

I didn't WANT any of the games, but didn't have them....so bought.

The general problem is that Humble has been releasing either a) awful bundles or b) re-bundles for the better part of a few months now. Buying said bundles does not give them incentive to get creative.

Just (finally) got around to hooking up this Rheosmart 6 fan controller that I won from NotSelf's giveaway a couple weeks ago, thought you guys might like to see a pic, and thanks again to NotSelf for the awesome giveaway!

hey I have that case!
in my closet
. Was a pretty good first case.
 

morningbus

Serious Sam is a wicked gahbidge series for chowdaheads.
hey, I won a couple days ago. Want my credit?

If you have no other plans for it, I will gladly accept your credit. To be clear though: while I deeply and sincerely appreciate it, I never intended to beg for the codes and if you know of any other home for it, please send it there before sending it my way.

Scoreboard Updated: $60 mark reached thanks to Amzin! We're closing in on that $80 threshold.
 

aku:jiki

Member
Just (finally) got around to hooking up this Rheosmart 6 fan controller that I won from NotSelf's giveaway a couple weeks ago, thought you guys might like to see a pic, and thanks again to NotSelf for the awesome giveaway!
Sir, I'm not sure if you're aware, but your computer is one of the cars from Tokyo Drift.

I like to keep my back row stocked with rocks and knives for throwing :p
I only have two throwing knives... Can I fetch them or do they disappear if they do damage?
 

Stumpokapow

listen to the mad man
If you have no other plans for it, I will gladly accept your credit. To be clear though: while I deeply and sincerely appreciate it, I never intended to beg for the codes and if you know of any other home for it, please send it there before sending it my way.

Scoreboard Updated: $60 mark reached thanks to Amzin! We're closing in on that $80 threshold.

Secretly you just used the money to make a big-ass tea order.
 

jshackles

Gentlemen, we can rebuild it. We have the capability to make the world's first enhanced store. Steam will be that store. Better than it was before.
Here's some Python I wrote yesterday that automagically goes through all your trade offers and rejects any trades which ask for any items, and accepts any trades which gift you items. There's enough item context information to isolate for coupons and go from there. Even if you don't use the Python, you can probably make use of the reverse engineering of the API. So this is enough code to make your own TrashBot with trade offers functionality only, basically.

One thing worth noting; sessionid cookies often have characters which require URL encoding (mine has at least one "=" symbol, for instance); don't double-encode them or the accept trades function won't work.

Awesome, that's pretty much exactly what I was looking for. ;)
 

Turfster

Member
That Codemasters bundle is one of the few weekly bundles I paid the full $6 for, it's a great bundle if you don't already have the games. I'd love to see them bring back more bundles this way, there's been a few that I regret passing on and some others that would make great gifts for my friends.

Well, it's now a weekly monday thing, apparently.
You're in luck.
 

Rhaknar

The Steam equivalent of the drunk friend who keeps offering to pay your tab all night.
holy shit the Blood games on steam heh. I loved those back in the day, well the first one at least, I dont think I ever played the second
 

morningbus

Serious Sam is a wicked gahbidge series for chowdaheads.
Secretly you just used the money to make a big-ass tea order.

I'm actually running one of the longest confidence tricks in history. I made a Tea OT and waited a whole year just to give away $100 in tea gift certificates just so I could come back in another year and scam SteamGaf you rubes out of $80.

How has no one done this before? It's so simple.
 

Sub Zero

his body's cold as ice, but he's got a heart of gold
The Witcher 3 RU
AllowCrossRegionTradingAndGifting No

is the dream dead?

I actually expected this to happen way sooner. The russian price was ridiculous.

Hope liez got rid of the gifts he had in his inventory, he was trying to sell a few of them iirc
 

lashman

Steam-GAF's Official Ambassador to Gaming-GAF
oh snap.

Although after like 6 weeks if people didn't pick it up for $16-20, you have no one to blame but yourself.



If you activated it you should be fine. If it's still in your inventory, you might be toast.

damn ... if only I had the cash to buy it, I would :( just my luck - 2 days before I'm finally about to get some money - this happens ; _ ;
 

JaseC

gave away the keys to the kingdom.
The Witcher 3 RU
AllowCrossRegionTradingAndGifting No

is the dream dead?

Not yet.

Code:
javascript:addToCart( 41074);

[B][Note: 41074 is ROW.][/B]

Could be a post-release sub. I don't see the sense in creating an RU-specific sub when there's the option of moving Eastern Europe to, uh, the European sub and disabling ACRTAG as the flag wouldn't affect the rest of Europe.

I actually expected this to happen way sooner. The russian price was ridiculous.

Hope liez got rid of the gifts he had in his inventory, he was trying to sell a few of them iirc

It's a new sub.
 

Speevy

Banned
Hey Stump, I may be in class when you come back. Will you have Modbot put up my game?

I still want someone to have it.

Thanks.
 
Status
Not open for further replies.
Top Bottom