diff --git a/accounts/forms.py b/accounts/forms.py index 114fd9c..e17b4de 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -1,7 +1,7 @@ from django import forms from accounts.models import Accounts -from accounts.utils import LoginHelper +from accounts.utils import LoginHelper, VocationHelper class LoginForm(forms.Form): @@ -18,3 +18,9 @@ class LoginForm(forms.Form): return True else: return False + +class CreateCharacterForm(forms.Form): + name = forms.CharField() + vocation = forms.ChoiceField( + choices=VocationHelper.get_base_vocation_choices()) + sex = forms.ChoiceField(choices=((0, 'female'), (1, 'male'))) \ No newline at end of file diff --git a/accounts/migrations/0002_auto_20190123_1959.py b/accounts/migrations/0002_auto_20190123_1959.py new file mode 100644 index 0000000..d261d2f --- /dev/null +++ b/accounts/migrations/0002_auto_20190123_1959.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.5 on 2019-01-23 19:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='accounts', + options={'managed': True}, + ), + ] diff --git a/accounts/migrations/0003_auto_20190123_2000.py b/accounts/migrations/0003_auto_20190123_2000.py new file mode 100644 index 0000000..6f7800d --- /dev/null +++ b/accounts/migrations/0003_auto_20190123_2000.py @@ -0,0 +1,41 @@ +# Generated by Django 2.1.5 on 2019-01-23 20:00 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('accounts', '0002_auto_20190123_1959'), + ] + + operations = [ + migrations.AddField( + model_name='accounts', + name='linked_django_user', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='accounts', + name='creation', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='accounts', + name='lastday', + field=models.PositiveIntegerField(default=0), + ), + migrations.AlterField( + model_name='accounts', + name='premdays', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='accounts', + name='type', + field=models.IntegerField(default=1), + ), + ] diff --git a/accounts/migrations/0004_auto_20190123_2214.py b/accounts/migrations/0004_auto_20190123_2214.py new file mode 100644 index 0000000..7e47f31 --- /dev/null +++ b/accounts/migrations/0004_auto_20190123_2214.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.5 on 2019-01-23 22:14 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0003_auto_20190123_2000'), + ] + + operations = [ + migrations.AlterModelOptions( + name='players', + options={'managed': True}, + ), + ] diff --git a/accounts/migrations/0005_auto_20190123_2225.py b/accounts/migrations/0005_auto_20190123_2225.py new file mode 100644 index 0000000..6a5a858 --- /dev/null +++ b/accounts/migrations/0005_auto_20190123_2225.py @@ -0,0 +1,259 @@ +# Generated by Django 2.1.5 on 2019-01-23 22:25 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0004_auto_20190123_2214'), + ] + + operations = [ + migrations.AddField( + model_name='players', + name='account', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.DO_NOTHING, to='accounts.Accounts'), + ), + migrations.AlterField( + model_name='players', + name='balance', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='blessings', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='cap', + field=models.IntegerField(default=400), + ), + migrations.AlterField( + model_name='players', + name='conditions', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='players', + name='deletion', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='experience', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='group_id', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='players', + name='health', + field=models.IntegerField(default=150), + ), + migrations.AlterField( + model_name='players', + name='healthmax', + field=models.IntegerField(default=150), + ), + migrations.AlterField( + model_name='players', + name='lastip', + field=models.PositiveIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='lastlogin', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='lastlogout', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='level', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='players', + name='lookaddons', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='lookbody', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='lookfeet', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='lookhead', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='looklegs', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='looktype', + field=models.IntegerField(default=136), + ), + migrations.AlterField( + model_name='players', + name='maglevel', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='players', + name='mana', + field=models.IntegerField(default=55), + ), + migrations.AlterField( + model_name='players', + name='manamax', + field=models.IntegerField(default=55), + ), + migrations.AlterField( + model_name='players', + name='manaspent', + field=models.PositiveIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='offlinetraining_skill', + field=models.IntegerField(default=-1), + ), + migrations.AlterField( + model_name='players', + name='offlinetraining_time', + field=models.PositiveSmallIntegerField(default=43200), + ), + migrations.AlterField( + model_name='players', + name='onlinetime', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='save', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='players', + name='sex', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_axe', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_axe_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_club', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_club_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_dist', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_dist_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_fishing', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_fishing_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_fist', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_fist_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_shielding', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_shielding_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skill_sword', + field=models.PositiveIntegerField(default=10), + ), + migrations.AlterField( + model_name='players', + name='skill_sword_tries', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skull', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='skulltime', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='soul', + field=models.PositiveIntegerField(default=0), + ), + migrations.AlterField( + model_name='players', + name='stamina', + field=models.PositiveSmallIntegerField(default=2520), + ), + migrations.AlterField( + model_name='players', + name='town_id', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='players', + name='vocation', + field=models.IntegerField(default=0), + ), + ] diff --git a/accounts/migrations/0006_auto_20190123_2232.py b/accounts/migrations/0006_auto_20190123_2232.py new file mode 100644 index 0000000..7a22459 --- /dev/null +++ b/accounts/migrations/0006_auto_20190123_2232.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2019-01-23 22:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0005_auto_20190123_2225'), + ] + + operations = [ + migrations.AlterField( + model_name='players', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + ] diff --git a/accounts/migrations/0007_auto_20190123_2239.py b/accounts/migrations/0007_auto_20190123_2239.py new file mode 100644 index 0000000..f9b5763 --- /dev/null +++ b/accounts/migrations/0007_auto_20190123_2239.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1.5 on 2019-01-23 22:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0006_auto_20190123_2232'), + ] + + operations = [ + migrations.RenameField( + model_name='players', + old_name='save', + new_name='tibia_save', + ), + migrations.AlterField( + model_name='players', + name='tibia_save', + field=models.IntegerField(db_column='save', default=1), + ), + ] diff --git a/accounts/migrations/0008_auto_20190123_2240.py b/accounts/migrations/0008_auto_20190123_2240.py new file mode 100644 index 0000000..cf8117b --- /dev/null +++ b/accounts/migrations/0008_auto_20190123_2240.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2019-01-23 22:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0007_auto_20190123_2239'), + ] + + operations = [ + migrations.AlterField( + model_name='players', + name='conditions', + field=models.TextField(blank=True, default='', null=True), + ), + ] diff --git a/accounts/models.py b/accounts/models.py index 42cedd5..7db2c98 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -290,62 +290,63 @@ class PlayerStorage(models.Model): class Players(models.Model): + id = models.AutoField(primary_key=True) name = models.CharField(unique=True, max_length=255) - group_id = models.IntegerField() - account = models.ForeignKey(Accounts, models.DO_NOTHING) - level = models.IntegerField() - vocation = models.IntegerField() - health = models.IntegerField() - healthmax = models.IntegerField() - experience = models.BigIntegerField() - lookbody = models.IntegerField() - lookfeet = models.IntegerField() - lookhead = models.IntegerField() - looklegs = models.IntegerField() - looktype = models.IntegerField() - lookaddons = models.IntegerField() - maglevel = models.IntegerField() - mana = models.IntegerField() - manamax = models.IntegerField() - manaspent = models.PositiveIntegerField() - soul = models.PositiveIntegerField() - town_id = models.IntegerField() + group_id = models.IntegerField(default=1) + account = models.ForeignKey(Accounts, models.DO_NOTHING, default=1) + level = models.IntegerField(default=1) + vocation = models.IntegerField(default=0) + health = models.IntegerField(default=150) + healthmax = models.IntegerField(default=150) + experience = models.BigIntegerField(default=0) + lookbody = models.IntegerField(default=0) + lookfeet = models.IntegerField(default=0) + lookhead = models.IntegerField(default=0) + looklegs = models.IntegerField(default=0) + looktype = models.IntegerField(default=136) + lookaddons = models.IntegerField(default=0) + maglevel = models.IntegerField(default=1) + mana = models.IntegerField(default=55) + manamax = models.IntegerField(default=55) + manaspent = models.PositiveIntegerField(default=0) + soul = models.PositiveIntegerField(default=0) + town_id = models.IntegerField(default=1) posx = models.IntegerField() posy = models.IntegerField() posz = models.IntegerField() - conditions = models.TextField() - cap = models.IntegerField() - sex = models.IntegerField() - lastlogin = models.BigIntegerField() - lastip = models.PositiveIntegerField() - save = models.IntegerField() - skull = models.IntegerField() - skulltime = models.IntegerField() - lastlogout = models.BigIntegerField() - blessings = models.IntegerField() - onlinetime = models.IntegerField() - deletion = models.BigIntegerField() - balance = models.BigIntegerField() - offlinetraining_time = models.PositiveSmallIntegerField() - offlinetraining_skill = models.IntegerField() - stamina = models.PositiveSmallIntegerField() - skill_fist = models.PositiveIntegerField() - skill_fist_tries = models.BigIntegerField() - skill_club = models.PositiveIntegerField() - skill_club_tries = models.BigIntegerField() - skill_sword = models.PositiveIntegerField() - skill_sword_tries = models.BigIntegerField() - skill_axe = models.PositiveIntegerField() - skill_axe_tries = models.BigIntegerField() - skill_dist = models.PositiveIntegerField() - skill_dist_tries = models.BigIntegerField() - skill_shielding = models.PositiveIntegerField() - skill_shielding_tries = models.BigIntegerField() - skill_fishing = models.PositiveIntegerField() - skill_fishing_tries = models.BigIntegerField() + conditions = models.TextField(blank=True, null=True, default='') + cap = models.IntegerField(default=400) + sex = models.IntegerField(default=0) + lastlogin = models.BigIntegerField(default=0) + lastip = models.PositiveIntegerField(default=0) + tibia_save = models.IntegerField(default=1, db_column='save') + skull = models.IntegerField(default=0) + skulltime = models.IntegerField(default=0) + lastlogout = models.BigIntegerField(default=0) + blessings = models.IntegerField(default=0) + onlinetime = models.IntegerField(default=0) + deletion = models.BigIntegerField(default=0) + balance = models.BigIntegerField(default=0) + offlinetraining_time = models.PositiveSmallIntegerField(default=43200) + offlinetraining_skill = models.IntegerField(default=-1) + stamina = models.PositiveSmallIntegerField(default=2520) + skill_fist = models.PositiveIntegerField(default=10) + skill_fist_tries = models.BigIntegerField(default=0) + skill_club = models.PositiveIntegerField(default=10) + skill_club_tries = models.BigIntegerField(default=0) + skill_sword = models.PositiveIntegerField(default=10) + skill_sword_tries = models.BigIntegerField(default=0) + skill_axe = models.PositiveIntegerField(default=10) + skill_axe_tries = models.BigIntegerField(default=0) + skill_dist = models.PositiveIntegerField(default=10) + skill_dist_tries = models.BigIntegerField(default=0) + skill_shielding = models.PositiveIntegerField(default=10) + skill_shielding_tries = models.BigIntegerField(default=0) + skill_fishing = models.PositiveIntegerField(default=10) + skill_fishing_tries = models.BigIntegerField(default=0) class Meta: - managed = False + managed = True db_table = 'players' diff --git a/accounts/templates/add_character.html b/accounts/templates/add_character.html new file mode 100644 index 0000000..fefcfcf --- /dev/null +++ b/accounts/templates/add_character.html @@ -0,0 +1,10 @@ +{% extends "base_generic.html" %} + +{% block content %} +

Add Character

+
{% csrf_token %} + {{ form.as_p }} + +
+ +{% endblock %} \ No newline at end of file diff --git a/accounts/templates/base_generic.html b/accounts/templates/base_generic.html index 68c7167..e0c9c33 100644 --- a/accounts/templates/base_generic.html +++ b/accounts/templates/base_generic.html @@ -21,7 +21,9 @@
  • Login
  • {% endif %}
  • Home
  • -
  • Account
  • + {% if user.is_authenticated %} +
  • My characters
  • + {% endif %}
  • All authors
  • {% endblock %} diff --git a/accounts/templates/players.html b/accounts/templates/players.html new file mode 100644 index 0000000..dd24d36 --- /dev/null +++ b/accounts/templates/players.html @@ -0,0 +1,16 @@ +{% extends "base_generic.html" %} + +{% block content %} + {% if players %} + + {% else %} + This account has no characters yet. + {% endif %} + + Create a new character + +{% endblock %} \ No newline at end of file diff --git a/accounts/urls.py b/accounts/urls.py index 8fc5803..12fd84c 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -8,4 +8,6 @@ app_name = 'accounts' urlpatterns = [ path('', views.IndexView.as_view(), name='index'), path('register/', views.RegisterAccountView.as_view(), name='register'), + path('characters/', views.PlayerView.as_view(), name='characters'), + path('create_character/', views.CreateCharView.as_view(), name='create_char'), ] \ No newline at end of file diff --git a/accounts/utils.py b/accounts/utils.py index ffa226d..7ae5b96 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -6,4 +6,25 @@ class LoginHelper(object): def hash_password(password): hashed_password = hashlib.sha1(password.encode('utf-8'))\ .hexdigest() - return hashed_password \ No newline at end of file + return hashed_password + +class VocationHelper(object): + mapper = { + 0: 'None', + 1: 'Sorcerer', + 2: 'Druid', + 3: 'Paladin', + 4: 'Knight', + 5: 'Master Sorcerer', + 6: 'Elder Druid', + 7: 'Royal Paladin', + 8: 'Elite Knight', + } + + @staticmethod + def vocation_to_string(vocation_id): + return VocationHelper.mapper[vocation_id] + + @staticmethod + def get_base_vocation_choices(): + return tuple([(k, v) for k, v, in VocationHelper.mapper.items() if k <= 4]) \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index aef69e0..4cd76b7 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,11 +1,14 @@ +from django import forms +from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import User from django.shortcuts import render, render_to_response +from django.urls import reverse, reverse_lazy from django.views import generic from django.views.generic.edit import CreateView, FormView # Create your views here. -from accounts.forms import LoginForm -from accounts.models import Accounts, Players -from accounts.utils import LoginHelper +from accounts.forms import CreateCharacterForm +from accounts.models import Accounts, Players, Towns +from accounts.utils import LoginHelper, VocationHelper class RegisterAccountView(CreateView): @@ -36,4 +39,53 @@ class IndexView(generic.ListView): context_object_name = 'best_players' def get_queryset(self): - return Players.objects.filter(group_id=1).order_by('-level').values('name', 'level')[:10] \ No newline at end of file + return Players.objects.filter(group_id=1).order_by('-level').values('name', 'level')[:10] + +class PlayerView(LoginRequiredMixin, generic.ListView): + template_name = 'players.html' + context_object_name = 'players' + + def get_queryset(self): + players = Players.objects.filter(account__linked_django_user=self.request.user)\ + .values('name', 'level', 'vocation') + return players + + def get_context_data(self, **kwargs): + context = super(PlayerView, self).get_context_data(**kwargs) + players = context['players'] + context['players'] = [{ + 'name': p['name'], + 'level': p['level'], + 'vocation': VocationHelper.vocation_to_string(p['vocation'])} + for p in players] + return context + +class CreateCharView(LoginRequiredMixin, FormView): + form_class = CreateCharacterForm + template_name = 'add_character.html' + success_url = reverse_lazy('accounts:characters') + + def form_valid(self, form): + rookgaard = Towns.objects.get(name='Rookgaard') + start_health = 150 + start_mana = 55 + start_cap = 400 + user = self.request.user + account = Accounts.objects.get(linked_django_user=user) + player = Players.objects.create( + name=form.cleaned_data['name'], + level=1, + vocation=int(form.cleaned_data['vocation']), + sex=int(form.cleaned_data['sex']), + posx=rookgaard.posx, + posy=rookgaard.posy, + posz=rookgaard.posz, + health=start_health, + healthmax=start_health, + mana=start_mana, + manamax=start_mana, + cap=start_cap, + account_id=account.id, + ) + return super(CreateCharView, self).form_valid(form) +