Quiz
1function start_count() {2$('.lobby_countdown_block').css('display', 'block');3$('#min').html('0' + min);4$('#sec').html('0' + sec);5interval = window.setInterval(() => {6if(sec == 59) {7sec = 0;8min++;9if(min < 10) {10$('#min').html('0' + min);11} else {12$('#min').html(min);13}14} else {15sec++;16}17if(sec < 10) {18$('#sec').html('0' + sec);19} else {20$('#sec').html(sec);21}22}, 1000);23}
24
25// функция создания сокета очереди
26function create_queue_socket(queue_id) {27// запуск сокета28queueSocket = new WebSocket (29'ws://' + window.location.host + '/ws/queue/' + queue_id30);31
32// метод при открытии сокета (пусто)33queueSocket.onopen = (e) => {34console.log('open')35console.log(e)36}37
38// метод при получении сообщения39queueSocket.onmessage = (e) => {40// получение объекта сообщения и действия из него41const data = JSON.parse(e.data)['message'];42let action = data['action'];43
44// запрос на подтверждение - создание кнопки и установление таймайта на её исчезновение45if(action == 'accept_request') {46$('body').append('<div class="lobby_accept_request_bg"><div class="lobby_accept_request_button"><span>Подтвердить</span></div></div>');47window.setTimeout(() => {48$('.lobby_accept_request_bg').remove();49accept_count = 0;50themes = [];51if(accepted == false) {52cancel_queue(true);53} else {54accepted = false;55}56}, 10000);57// подсчёт подтверждений, если это последний пользователь, присоединившийся к очереди58} else if(action == 'accept_count' && is_last_player) {59accept_count++;60if(Object.keys(data).includes('theme')) {61themes.push(data['theme']);62}63// если получено необходимое количество подтверждений, запуск действий на серверной части,64// необходимых для запуска игры65if(accept_count == max_players) {66$.ajax({67method: "get",68url: "/games/create_game/",69data: {themes: JSON.stringify(themes)},70success: (data) => {71// отправка пользователям в очереди ссылки для перехода в игру72queueSocket.send(73JSON.stringify({'message': {'action': 'create_game', 'url': data.url}})74)75},76error: (data) => {77}78});79};80// переход в игру по ссылке81} else if(action == 'create_game') {82window.location.href = data['url'];83};84};85
86// метод при закрытии сокета (пусто)87queueSocket.onclose = (e) => {88console.log('close')89console.log(e);90}91
92// метод при ошибке у сокета (пусто)93queueSocket.onerror = (e) => {94console.log('error')95console.log(e)96}97};98
99// функция проверки сокета и отправки запросов на подтверждение игры пользователям от последнего игрока в очереди
100function connection_check() {101// если сокет подключён и готов к работе, отправка запросов102if(queueSocket.readyState === 1) {103queueSocket.send(104JSON.stringify({'message': {'action': 'accept_request'}})105)106// если нет, пробуем снова через 0.5 секунды107} else {108window.setTimeout(connection_check, 500);109}110};111
112// функция выхода из очереди
113function cancel_queue(is_canceler) {114// необходимые изменения интерфейса115$('.lobby_cancel_queue_button').html('Начать игру');116$('.lobby_cancel_queue_button').addClass('lobby_start_game_button');117$('.lobby_cancel_queue_button').removeClass('lobby_cancel_queue_button');118
119// очистка отсчёта120window.clearInterval(interval);121sec = 0;122min = 0;123$('.lobby_countdown_block').css('display', '');124$('#sec').html('');125$('#min').html('');126
127// закрытие сокета очереди и запуск соответствующих действий на серверной части128queueSocket.close();129if(is_canceler) {130$.ajax({131method: "get",132url: "/games/cancel_queue/",133data: {},134success: (data) => {135},136error: (data) => {137}138});139}140}
141
142// функция выхода из лобби (запуск соответствующих действий на серверной части)
143function quit_lobby() {144$.ajax({145method: "get",146url: "/games/quit_lobby/",147data: {},148success: (data) => {149},150error: (data) => {151}152});153}
154