mirror of
https://github.com/creyD/asiimov.git
synced 2026-06-13 17:42:22 +02:00
Added Steam OpenID Login
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<a href="{% url 'offer_create' %}">Add Offer</a> | <a href="{% url 'me_settings' %}">settings</a> | Welcome, <a href="{% url 'me' %}">{{ user.gamer.display_name }}</a>
|
<a href="{% url 'offer_create' %}">Add Offer</a> | <a href="{% url 'me_settings' %}">settings</a> | Welcome, <a href="{% url 'me' %}">{{ user.gamer.display_name }}</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href=""><img src="{% static 'pic/steam_sign_in.png' %}" /></a>
|
<a href="{% url 'signup' %}"><img src="{% static 'pic/steam_sign_in.png' %}" /></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@@ -7,3 +7,8 @@ from .models import ItemType, Stickers, ItemInstance, Badge, Gamer
|
|||||||
class ItemTypeAdmin(admin.ModelAdmin):
|
class ItemTypeAdmin(admin.ModelAdmin):
|
||||||
list_display = ('paint_index', 'name', 'type', 'rarity', 'min_float', 'max_float', 'tradable')
|
list_display = ('paint_index', 'name', 'type', 'rarity', 'min_float', 'max_float', 'tradable')
|
||||||
list_editable = ()
|
list_editable = ()
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Gamer)
|
||||||
|
class Gamer(admin.ModelAdmin):
|
||||||
|
list_display = ('steamid', 'communityvisibilitystate', 'profilestate', 'personaname', 'commentpermission', 'timecreated', 'loccountrycode')
|
||||||
|
|||||||
109
src/core/migrations/0001_initial.py
Normal file
109
src/core/migrations/0001_initial.py
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
# Generated by Django 3.0.2 on 2020-01-15 21:04
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Badge',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=256, unique=True)),
|
||||||
|
('desc', models.CharField(max_length=1000)),
|
||||||
|
('icon', models.FileField(upload_to='badge_icons/')),
|
||||||
|
('rarity', models.CharField(choices=[(1, 'Normal'), (2, 'Rare'), (3, 'Super Rare')], default=1, max_length=10)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Gamer',
|
||||||
|
fields=[
|
||||||
|
('steamid', models.IntegerField(primary_key=True, serialize=False, unique=True)),
|
||||||
|
('communityvisibilitystate', models.BooleanField()),
|
||||||
|
('profilestate', models.BooleanField()),
|
||||||
|
('personaname', models.CharField(max_length=32)),
|
||||||
|
('profileurl', models.URLField(max_length=256)),
|
||||||
|
('avatar', models.URLField(max_length=256)),
|
||||||
|
('commentpermission', models.BooleanField()),
|
||||||
|
('timecreated', models.IntegerField(null=True)),
|
||||||
|
('loccountrycode', models.CharField(max_length=2, null=True)),
|
||||||
|
('API_KEY', models.CharField(max_length=32, null=True)),
|
||||||
|
('badges', models.ManyToManyField(to='core.Badge')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ItemInstance',
|
||||||
|
fields=[
|
||||||
|
('instanceid', models.IntegerField(primary_key=True, serialize=False, unique=True)),
|
||||||
|
('market_tradable_restriction', models.IntegerField()),
|
||||||
|
('inspect_link', models.URLField(max_length=512, null=True)),
|
||||||
|
('wear', models.CharField(max_length=100)),
|
||||||
|
('float', models.FloatField()),
|
||||||
|
('paintseed', models.IntegerField()),
|
||||||
|
('killeatervalue', models.IntegerField(null=True)),
|
||||||
|
('customname', models.CharField(max_length=128, null=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ItemType',
|
||||||
|
fields=[
|
||||||
|
('paint_index', models.IntegerField(primary_key=True, serialize=False, unique=True)),
|
||||||
|
('classid', models.IntegerField()),
|
||||||
|
('appid', models.IntegerField()),
|
||||||
|
('tradable', models.BooleanField(default=False)),
|
||||||
|
('icon_url', models.URLField(max_length=512, null=True)),
|
||||||
|
('name', models.CharField(max_length=1000)),
|
||||||
|
('name_color', models.CharField(max_length=7)),
|
||||||
|
('type', models.CharField(max_length=1000)),
|
||||||
|
('rarity', models.CharField(max_length=1000)),
|
||||||
|
('min_float', models.FloatField()),
|
||||||
|
('max_float', models.FloatField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Stickers',
|
||||||
|
fields=[
|
||||||
|
('stickerid', models.IntegerField(primary_key=True, serialize=False, unique=True)),
|
||||||
|
('name', models.CharField(max_length=1000)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Offer',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('items_give', models.ManyToManyField(related_name='OfferedItems', to='core.ItemInstance')),
|
||||||
|
('items_want', models.ManyToManyField(related_name='WantedItems', to='core.ItemInstance')),
|
||||||
|
('offeror', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Gamer')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='iteminstance',
|
||||||
|
name='item_class',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='core.ItemType'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='iteminstance',
|
||||||
|
name='stickers',
|
||||||
|
field=models.ManyToManyField(to='core.Stickers'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='gamer',
|
||||||
|
name='inventory',
|
||||||
|
field=models.ManyToManyField(to='core.ItemInstance'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='gamer',
|
||||||
|
name='system_user',
|
||||||
|
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -52,6 +52,18 @@ class ItemInstance(models.Model):
|
|||||||
customname = models.CharField(max_length=128, null=True) # Nametag
|
customname = models.CharField(max_length=128, null=True) # Nametag
|
||||||
stickers = models.ManyToManyField(Stickers)
|
stickers = models.ManyToManyField(Stickers)
|
||||||
|
|
||||||
|
def getInspectLink(self):
|
||||||
|
if self.getOwner():
|
||||||
|
fresh_link = self.inspect_link
|
||||||
|
link = fresh_link.replace("%owner_steamid%", self.getOwner().steamid).replace("%assetid%", self.instanceid)
|
||||||
|
return link
|
||||||
|
return False
|
||||||
|
|
||||||
|
def getOwner(self):
|
||||||
|
if Gamer.objects.filter(inventory__contains=self).exists():
|
||||||
|
return Gamer.objects.filter(inventory__contains=self)[0]
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# Badges that can be eared on the site
|
# Badges that can be eared on the site
|
||||||
class Badge(models.Model):
|
class Badge(models.Model):
|
||||||
@@ -95,4 +107,5 @@ class Offer(models.Model):
|
|||||||
|
|
||||||
@receiver(post_save, sender=User)
|
@receiver(post_save, sender=User)
|
||||||
def save_user_profile(sender, instance, **kwargs):
|
def save_user_profile(sender, instance, **kwargs):
|
||||||
instance.gamer.save()
|
if Gamer.objects.filter(system_user=instance).exists():
|
||||||
|
instance.gamer.save()
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ STEAM_SERVER = 'https://api.steampowered.com/'
|
|||||||
USER_METHOD = 'ISteamUser/GetPlayerSummaries/v2'
|
USER_METHOD = 'ISteamUser/GetPlayerSummaries/v2'
|
||||||
INVENTORY_SERVER = 'https://steamcommunity.com/inventory/'
|
INVENTORY_SERVER = 'https://steamcommunity.com/inventory/'
|
||||||
|
|
||||||
|
FLOAT_SERVER = 'https://api.csgofloat.com/?url='
|
||||||
|
|
||||||
|
|
||||||
# Get the mandatory gamer info for a gamer
|
# Get the mandatory gamer info for a gamer
|
||||||
def getUserInfo(steamID, API_KEY=settings.STEAM_API_KEY):
|
def getUserInfo(steamID, API_KEY=settings.STEAM_API_KEY):
|
||||||
@@ -21,3 +23,8 @@ def getUserInventory(steamID, API_KEY=settings.STEAM_API_KEY, GAME_ID=730):
|
|||||||
QUERY = INVENTORY_SERVER + '/' + steamID + '/' + GAME_ID + '/2?l=english&count=5000'
|
QUERY = INVENTORY_SERVER + '/' + steamID + '/' + GAME_ID + '/2?l=english&count=5000'
|
||||||
inventory_object = json.load(urllib.request.urlopen(QUERY))
|
inventory_object = json.load(urllib.request.urlopen(QUERY))
|
||||||
return inventory_object
|
return inventory_object
|
||||||
|
|
||||||
|
|
||||||
|
def getFloat(asset, steamID):
|
||||||
|
QUERY = FLOAT_SERVER + asset.getInspectLink()
|
||||||
|
return json.load(urllib.request.urlopen(QUERY))
|
||||||
|
|||||||
1
src/core/templates/core/signup.html
Normal file
1
src/core/templates/core/signup.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{{ url }}
|
||||||
@@ -16,5 +16,8 @@ urlpatterns = [
|
|||||||
|
|
||||||
path('help', views.help, name='help'),
|
path('help', views.help, name='help'),
|
||||||
path('imprint', views.imprint, name='imprint'),
|
path('imprint', views.imprint, name='imprint'),
|
||||||
path('about', views.about, name='about')
|
path('about', views.about, name='about'),
|
||||||
|
|
||||||
|
path('signup', views.signup, name='signup'),
|
||||||
|
path('signup_confirm', views.signup_confirm)
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,7 +1,35 @@
|
|||||||
|
# Import the local models
|
||||||
from .models import Offer, Gamer
|
from .models import Offer, Gamer
|
||||||
|
# Django shortcuts for certain things
|
||||||
from django.shortcuts import render, get_object_or_404, redirect
|
from django.shortcuts import render, get_object_or_404, redirect
|
||||||
|
# For catching permission errors
|
||||||
from django.http import HttpResponseForbidden
|
from django.http import HttpResponseForbidden
|
||||||
|
# For permitting only logged in users to see their private area
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
# For Steam Open ID handling
|
||||||
|
from urllib import parse
|
||||||
|
# For requesting the identification check
|
||||||
|
import requests
|
||||||
|
# For manually creating system users
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
# For getting the API interaction methods
|
||||||
|
from .steam_api import getUserInfo
|
||||||
|
# Import for manually logging in user after creation
|
||||||
|
from django.contrib.auth import login
|
||||||
|
|
||||||
|
|
||||||
|
# HELPER
|
||||||
|
def validate_steam_login(params):
|
||||||
|
steam_login_url_base = "https://steamcommunity.com/openid/login"
|
||||||
|
|
||||||
|
new_params = params.copy()
|
||||||
|
new_params["openid.mode"] = "check_authentication"
|
||||||
|
|
||||||
|
r = requests.post(steam_login_url_base, data=new_params)
|
||||||
|
|
||||||
|
if "is_valid:true" in r.text:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# STATIC PAGES
|
# STATIC PAGES
|
||||||
@@ -36,6 +64,48 @@ def search(request, filter):
|
|||||||
return render(request, 'core/filter.html')
|
return render(request, 'core/filter.html')
|
||||||
|
|
||||||
|
|
||||||
|
# USER SIGNUP
|
||||||
|
def signup(request):
|
||||||
|
steam_openid_url = 'https://steamcommunity.com/openid/login'
|
||||||
|
u = {
|
||||||
|
'openid.ns': "http://specs.openid.net/auth/2.0",
|
||||||
|
'openid.identity': "http://specs.openid.net/auth/2.0/identifier_select",
|
||||||
|
'openid.claimed_id': "http://specs.openid.net/auth/2.0/identifier_select",
|
||||||
|
'openid.mode': 'checkid_setup',
|
||||||
|
'openid.return_to': 'http://' + request.META['HTTP_HOST'] + '/signup_confirm',
|
||||||
|
'openid.realm': 'http://' + request.META['HTTP_HOST'] + ''
|
||||||
|
}
|
||||||
|
|
||||||
|
query_string = parse.urlencode(u)
|
||||||
|
auth_url = steam_openid_url + '?' + query_string
|
||||||
|
return redirect(auth_url)
|
||||||
|
|
||||||
|
|
||||||
|
def signup_confirm(request):
|
||||||
|
if validate_steam_login(request.GET):
|
||||||
|
claimed_id = request.GET.get('openid.claimed_id')
|
||||||
|
claimed_id = claimed_id.split('/')[-1]
|
||||||
|
new_user, created = User.objects.get_or_create(username=claimed_id)
|
||||||
|
|
||||||
|
if created:
|
||||||
|
info = getUserInfo(claimed_id)
|
||||||
|
Gamer.objects.create(
|
||||||
|
steamid=claimed_id,
|
||||||
|
system_user=new_user,
|
||||||
|
communityvisibilitystate=(True if info['response']['players'][0]['communityvisibilitystate'] == 3 else False),
|
||||||
|
profilestate=info['response']['players'][0]['profilestate'],
|
||||||
|
personaname=info['response']['players'][0]['personaname'],
|
||||||
|
profileurl=info['response']['players'][0]['profileurl'],
|
||||||
|
avatar=info['response']['players'][0]['avatar'],
|
||||||
|
commentpermission=info['response']['players'][0]['commentpermission'],
|
||||||
|
timecreated=info['response']['players'][0]['timecreated'] or None,
|
||||||
|
loccountrycode=info['response']['players'][0]['loccountrycode'] or None
|
||||||
|
)
|
||||||
|
login(request, new_user)
|
||||||
|
return redirect(me)
|
||||||
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
|
|
||||||
# USER AREA
|
# USER AREA
|
||||||
@login_required
|
@login_required
|
||||||
def offer_refresh(request, offerID):
|
def offer_refresh(request, offerID):
|
||||||
@@ -68,10 +138,10 @@ def profile(request, steamID):
|
|||||||
# PRIVATE AREA
|
# PRIVATE AREA
|
||||||
@login_required
|
@login_required
|
||||||
def me(request):
|
def me(request):
|
||||||
return render(request, 'core/profile.html', {'gamer': Gamer.object.get(system_user=request.User)})
|
return render(request, 'core/profile.html', {'gamer': Gamer.objects.get(system_user=request.user)})
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def me_settings(request):
|
def me_settings(request):
|
||||||
dude = get_object_or_404(Gamer, system_user=request.User)
|
dude = get_object_or_404(Gamer, system_user=request.user)
|
||||||
return render(request, 'core/settings.html', {'gamer': dude})
|
return render(request, 'core/settings.html', {'gamer': dude})
|
||||||
|
|||||||
Reference in New Issue
Block a user