Теги: django jquery python

Улучшения

Делаем функцию очистки стола и сброса всех игроков в статус ‘beter’.

def clear_table():
    with open(json_path, 'r') as file:
        json_data = json.loads(file.read())
    json_data['table'] = []
    with open(json_path, 'w') as file:
        file.write(json.dumps(json_data)) 
    for c2u in Card2User.objects.filter(position='table'):
        c2u.delete()
    for user in Gameuser.objects.filter():
        user.state = 'betor'
        user.save()
        dial_cards_to_user(user)

Очищаем стол при логине

def index(request):
    user = None
    if request.method == 'POST':
       ...
        clear_table()

Добавим функцию поиска загадывающего.

    get_gessor = function(users){
        for(var i=0; i<=users.length-1; i++) {
            if (users[i].state === 'gessor' || 'gessed') 
            {
                return users[i];
            }
        }
    }

Применим ее при перерисовке пользователей.

        var gessor = get_gessor(state.users);
        if(gessor) {
            var gessor_image = $('#gessor_image');
            let tpl = `<img src="${gessor.image}" alt="avatar" class="avatar-50 ">
            <span class="avatar-status"><i class="ri-checkbox-blank-circle-fill text-success"></i></span>`;
            gessor_image.empty();
            gessor_image.append(tpl);
        }

Создадим команду очистки пользователей.

from django.core.management.base import BaseCommand, CommandError
from game.models import Gameuser
from django.core.files import File
from imagin.settings import BASE_DIR

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('clear users')
        Gameuser.objects.all().delete()

Определение браузерного хранилища.

Определим глобальную переменную в .env.

BROWSER_STORAGE='sessionStorage'

Возмем ее в настройках.

from dotenv import load_dotenv
load_dotenv()
...
BROWSER_STORAGE = os.getenv('BROWSER_STORAGE','sessionStorage')

Прокинем в шаблон.

from imagin.settings import BROWSER_STORAGE

def index(request):
    ....

    return render(request, 'index.html', {... "storage": BROWSER_STORAGE})

Используем в шаблоне.

    <script>
        var login = window.{{storage}}.getItem('login');
        if (login) {
            window.location = '/game';
        } 
    </script>

Разлогирование

Шаблон

<h1>Good buy !!!</h1>
 <script>
    window.{{storage}}.removeItem('login');
    window.{{storage}}.removeItem('image');
    window.location = '/';
 </script>

Представление.

from django.shortcuts import render
from game.models import Gameuser
from imagin.settings import BROWSER_STORAGE

def logout(request,login):
    user = Gameuser.objects.get(login=login)
    user.delete()
    return render(request, 'logout.html',{"storage": BROWSER_STORAGE})

Финальные доработки.

Подсчет результатов с передачей сообщения на фронтенд.

import socketio   
mgr = socketio.RedisManager('redis://localhost:6379/0', write_only=True)

def try_to_count():
    usercheck = Gameuser.objects.filter(Q(state='propose') | Q(state='bet') | Q(state='beted'), is_online=True).count()
    print('Checkuser ', usercheck)
    if usercheck == 0:
        print('Counting')

        ## Формируем json
        jdata = []
        for p in Propose.objects.all():
            if p.is_right:
                user = p.proposer
                user.account += 1
                user.save()
                jdata.append({
                    "image": p.card.image.url,
                    "is_right": p.is_right,
                    "bonus": 1,
                    "owner": {
                        "login": p.proposer.login,
                        "image": p.proposer.image.url
                    }
                })
            else:
                user = p.owner
                user.account += 1
                user.save()
                jdata.append({
                    "image": p.card.image.url,
                    "is_right": p.is_right,
                    "bonus": 1,
                    "owner": {
                        "login": p.owner.login,
                        "image": p.owner.image.url
                    }
                })

        mgr.emit('rezult', data=jdata)

        Card2User.objects.filter(position='table').delete()
        for user in Gameuser.objects.filter(is_online=True):
            dial_cards_to_user(user)

        ## Передадим ход дальше
        dialer = Gameuser.objects.get(state='gessed')
        try:
            nextuser = Gameuser.objects.filter(state='proposed', is_online=True, id__gt=dialer.id).order_by('id')[0]
        except:
            nextuser = Gameuser.objects.filter(state='proposed', is_online=True).order_by('-id')[0]
        Gameuser.objects.all().update(state='betor')
        nextuser.state = 'gessor'
        nextuser.save()
        Propose.objects.all().delete()

Отображение на фронтенде.

socket.on('rezult', msg => {
    draw_rezult(msg);
})

var draw_rezult = function (state) {
    var rb =  $('#rezult_board')

    $('#rezult_block').show();
    $('#hand_block').hide();
    $('#board_block').hide();
    state.forEach(function(el){
        if(el.is_right){
            var isr = 'right-card';
        } else {
            var isr = 'wrong-card';
        }
        let tpl = `

            <div class="avatar chat-user-profile m-0 mr-3 rez-p-${isr}">
                <img class="${isr}" height="70" src="${el.image}" />
            <img src="${el.owner.image}" alt="avatar" class="avatar-50 ">
            <span style="color: black">${el.owner.login}</span>
            <span class ="rez-bonus">+${el.bonus}</span>
            </div>
        `;
        rb.append(tpl);
    });
}
Задать вопрос, прокомментировать.