diff --git a/src/common/templates/master.html b/src/common/templates/master.html
index 66ca612..6dd5620 100644
--- a/src/common/templates/master.html
+++ b/src/common/templates/master.html
@@ -23,7 +23,7 @@
{% if user.is_authenticated %}
-
Add Offer |
Settings | Welcome,
{{ user.gamer.personaname }} (Logout)
+
Add Offer |
Inventory |
Settings | Welcome,
{{ user.gamer.personaname }} (Logout)
{% else %}

{% endif %}
diff --git a/src/core/migrations/0004_auto_20200119_1201.py b/src/core/migrations/0004_auto_20200119_1201.py
new file mode 100644
index 0000000..679e070
--- /dev/null
+++ b/src/core/migrations/0004_auto_20200119_1201.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.2 on 2020-01-19 11:01
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0003_gamer_offer_count'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='itemtype',
+ name='max_float',
+ field=models.FloatField(null=True),
+ ),
+ migrations.AlterField(
+ model_name='itemtype',
+ name='min_float',
+ field=models.FloatField(null=True),
+ ),
+ ]
diff --git a/src/core/migrations/0005_auto_20200119_1205.py b/src/core/migrations/0005_auto_20200119_1205.py
new file mode 100644
index 0000000..cd23aa4
--- /dev/null
+++ b/src/core/migrations/0005_auto_20200119_1205.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.2 on 2020-01-19 11:05
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0004_auto_20200119_1201'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='iteminstance',
+ name='float',
+ field=models.FloatField(null=True),
+ ),
+ migrations.AlterField(
+ model_name='iteminstance',
+ name='paintseed',
+ field=models.IntegerField(null=True),
+ ),
+ ]
diff --git a/src/core/migrations/0006_auto_20200119_1240.py b/src/core/migrations/0006_auto_20200119_1240.py
new file mode 100644
index 0000000..ce5f733
--- /dev/null
+++ b/src/core/migrations/0006_auto_20200119_1240.py
@@ -0,0 +1,36 @@
+# Generated by Django 3.0.2 on 2020-01-19 11:40
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0005_auto_20200119_1205'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='iteminstance',
+ name='float',
+ field=models.FloatField(default=0),
+ preserve_default=False,
+ ),
+ migrations.AlterField(
+ model_name='iteminstance',
+ name='inspect_link',
+ field=models.URLField(default='http://test.org', max_length=512),
+ preserve_default=False,
+ ),
+ migrations.AlterField(
+ model_name='iteminstance',
+ name='market_tradable_restriction',
+ field=models.CharField(max_length=1, null=True),
+ ),
+ migrations.AlterField(
+ model_name='iteminstance',
+ name='paintseed',
+ field=models.IntegerField(default=1),
+ preserve_default=False,
+ ),
+ ]
diff --git a/src/core/models.py b/src/core/models.py
index abe0575..30cda4b 100644
--- a/src/core/models.py
+++ b/src/core/models.py
@@ -29,8 +29,8 @@ class ItemType(models.Model):
name_color = models.CharField(max_length=7) # Hexadecimal color of the name
type = models.CharField(max_length=1000) # i.e. ★ Covert Knife
rarity = models.CharField(max_length=1000) # tags > category = rarity > localized_tag_name
- min_float = models.FloatField()
- max_float = models.FloatField()
+ min_float = models.FloatField(null=True) # At creation time there is no data, so we need null=True
+ max_float = models.FloatField(null=True) # At creation time there is no data, so we need null=True
# Class for storing stickers applied to weapons
@@ -43,13 +43,13 @@ class Stickers(models.Model):
class ItemInstance(models.Model):
item_class = models.ForeignKey(ItemType, on_delete=models.PROTECT)
instanceid = models.IntegerField(primary_key=True, unique=True) # 0 for something like cases, which will be excluded here
- market_tradable_restriction = models.IntegerField() # How long the item will be trade locked
- inspect_link = models.URLField(max_length=512, null=True)
+ market_tradable_restriction = models.CharField(max_length=1, null=True) # How long the item will be trade locked | null is not tradelocked
+ inspect_link = models.URLField(max_length=512)
wear = models.CharField(max_length=100) # tags > category = exterior > localized_tag_name
float = models.FloatField() # Float of the object
paintseed = models.IntegerField() # Pattern ID
- killeatervalue = models.IntegerField(null=True) # StatTrack
- customname = models.CharField(max_length=128, null=True) # Nametag
+ killeatervalue = models.IntegerField(null=True) # StatTrack | null is no StatTrack
+ customname = models.CharField(max_length=128, null=True) # Nametag | null is no Nametag
stickers = models.ManyToManyField(Stickers)
def getInspectLink(self):
@@ -87,7 +87,7 @@ class Gamer(models.Model):
avatar = models.URLField(max_length=256)
commentpermission = models.BooleanField() # If set, profile allows public comments
- # Optional Fields (only available if public profile)
+ # Optional Fields (only available if public profile else null)
timecreated = models.IntegerField(null=True) # Only visible if user has profile visibility
loccountrycode = models.CharField(max_length=2, null=True) # 2 char ISO country code
diff --git a/src/core/steam_api.py b/src/core/steam_api.py
index 1a9f088..a601aa8 100644
--- a/src/core/steam_api.py
+++ b/src/core/steam_api.py
@@ -3,6 +3,8 @@ import urllib.request
import json
# For getting the STEAM_API_KEY
from django.conf import settings
+from .models import Gamer, ItemType, ItemInstance
+from django.shortcuts import get_object_or_404
STEAM_SERVER = 'https://api.steampowered.com/'
USER_METHOD = 'ISteamUser/GetPlayerSummaries/v2'
@@ -18,13 +20,68 @@ def getUserInfo(steamID, API_KEY=settings.STEAM_API_KEY):
return player_object['response']['players'][0]
+def getInstanceData(inventory_object, instance_id):
+ for key in inventory_object['descriptions']:
+ if key['instanceid'] == instance_id:
+ return key
+
+
+def getFloat(inspect_link):
+ QUERY = FLOAT_SERVER + inspect_link
+ float_object = json.load(urllib.request.urlopen(QUERY))
+ if 'error' in float_object:
+ return False
+ return float_object
+
+
+def getSubTag(scope, search_key, search_value):
+ for tag in scope:
+ if tag.search_key == search_value:
+ return tag
+ return False
+
+
# Get the CS:GO inventory of a gamer
-def getUserInventory(steamID, API_KEY=settings.STEAM_API_KEY, GAME_ID=730):
- QUERY = INVENTORY_SERVER + '/' + steamID + '/' + GAME_ID + '/2?l=english&count=5000'
+def updateInventory(steamID, GAME_ID=730):
+ gamer = get_object_or_404(Gamer, steamid=steamID)
+ QUERY = INVENTORY_SERVER + str(steamID) + '/' + str(GAME_ID) + '/2?l=english&count=5000'
inventory_object = json.load(urllib.request.urlopen(QUERY))
- return inventory_object
-
-
-def getFloat(asset, steamID):
- QUERY = FLOAT_SERVER + asset.getInspectLink()
- return json.load(urllib.request.urlopen(QUERY))
+ if 'success' in inventory_object:
+ for item in inventory_object['assets']:
+ if item['instanceid'] == 0:
+ pass
+ else:
+ instance_data = getInstanceData(inventory_object, item['instanceid'])
+ link = instance_data['actions'][0]['link'].replace("%owner_steamid%", str(steamID)).replace("%assetid%", str(item['instanceid']))
+ while (True):
+ item_infos = getFloat(link)
+ if item_infos:
+ break
+ item_class = ItemType.objects.get_or_create(
+ paint_index=item_infos['iteminfo']['paintindex'],
+ classid=item['classid'],
+ appid=item['appid'],
+ tradable=(True if item['marketable'] == 1 else False),
+ icon_url=item_infos['iteminfo']['imageurl'],
+ name=item['name'],
+ name_color=item['name_color'],
+ type=item['type'],
+ rarity=getSubTag(item['tags'], 'category', 'Rarity').localized_tag_name,
+ min_float=item_infos['iteminfo']['min'],
+ max_float=item_infos['iteminfo']['max']
+ )
+ new_item = ItemInstance.objects.get_or_create(
+ item_class=item_class[0],
+ instanceid=item['instanceid'],
+ market_tradable_restriction=(item['owner_descriptions'][1]['value']
+ if 'owner_descriptions' in item else None),
+ inspect_link=instance_data['actions'][0]['link'],
+ wear=item_infos['iteminfo']['wear_name'],
+ float=item_infos['iteminfo']['floatvalue'],
+ paintseed=item_infos['iteminfo']['paintseed'],
+ killeatervalue=(item_infos['iteminfo']['killeatervalue'] if 'killeatervalue' in item_infos['iteminfo'] else None),
+ customname=(item_infos['iteminfo']['customname'] if 'customname' in item_infos['iteminfo'] else None)
+ )
+ gamer.inventory.add(new_item)
+ return inventory_object
+ return False
diff --git a/src/core/templates/profile/inventory.html b/src/core/templates/profile/inventory.html
new file mode 100644
index 0000000..86e5baf
--- /dev/null
+++ b/src/core/templates/profile/inventory.html
@@ -0,0 +1,24 @@
+{% extends 'master.html' %}
+{% load static %}
+
+{% block header %}
+
+
+{% endblock %}
+
+{% block content %}
+
+
{{ gamer.personaname }} - Inventory
+
+ {% if request.user.gamer == gamer %}
Refresh Inventory Data
{% endif %}
+
+ {% for item in gamer.inventory.all %}
+
+
item.item_class.name
+
+
+ {% empty %}
+ No Invetory Data!
+ {% endfor %}
+
+{% endblock %}
diff --git a/src/core/templates/profile/profile.html b/src/core/templates/profile/profile.html
index 733fdd3..5e56147 100644
--- a/src/core/templates/profile/profile.html
+++ b/src/core/templates/profile/profile.html
@@ -14,6 +14,7 @@
Links
@@ -35,9 +36,9 @@
Statistics
+
Live Offers: {{ live_offers }}
Offers created: {{ gamer.offer_count }}
-
Live Offers: {{ live_offers }}
-
Member since: {{ gamer.system_user.date_joined }}
-
Last Login: {{ gamer.system_user.last_login }}
+
Asiimov Member since: {{ gamer.system_user.date_joined }}
+
Last Asiimov Login: {{ gamer.system_user.last_login }}
{% endblock %}
diff --git a/src/core/urls.py b/src/core/urls.py
index dbc4761..eb72e17 100644
--- a/src/core/urls.py
+++ b/src/core/urls.py
@@ -12,8 +12,11 @@ urlpatterns = [
path('search/