Michael / SudPuce

// ==UserScript==
// @name        SudPuce
// @namespace sudpuce
// @grant none
// @match     http://www.dreadcast.net/Main*
// @version     0.1.4
// @description Accès aux serveurs matriciels liés aux puces du Sud
// @require     https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.2/socket.io.min.js
// ==/UserScript==

(function () {
    'use strict';

    var target = 'http://puce-sudard.rhcloud.com:8000/';
    var socket = io.connect(target);
    var chip_serial = '';
    var chip_cmd_filter = /^puce\+(.*)$/gm;
    var hasFocus = true;

    $('#img_avatar').append('<span id="mysouthchip" style="display:none;position:absolute;border-radius: 50%;width: 10px;height: 10px;background: gray;border:1px solid black;right:1px;top:1px;" title="Puce inactive"></span>');

    socket.on('disconnect', function () {
        chip_serial = '';
        $('#mysouthchip').hide();
        $('#mysouthchip').css({
            "background": 'gray'
        });
        $('#mysouthchip').attr('title', 'Puce inactive');
    }); 

    socket.on('error', function () {
        chip_serial = '';
        $('#mysouthchip').hide();
        $('#mysouthchip').css({
            "background": 'gray'
        });
        $('#mysouthchip').attr('title', 'Puce inactive');
    });

    socket.on('blink', function (data) {
        if (hasFocus) {
            var current_title = $('#mysouthchip').attr("title");
            var current_color = $('#mysouthchip').css("background");
            $('#mysouthchip').attr('title', data.chip_title);
            $('#mysouthchip').css({
                background: data.color
            });
            $('#mysouthchip').fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100, function () {
                $('#mysouthchip').attr('title', current_title);
                $('#mysouthchip').css({
                    background: current_color
                });
            });
        }
    });

    socket.on('update', function (data) {
        $('#mysouthchip').css({
            background: data.color
        });
        $('#mysouthchip').attr('title', data.chip_title);
    });


    function parsePostData(data) {
        return JSON.parse('{"' + decodeURI(data).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}');
    }


    function genResponseLine() {
        var response = $('<div />');
        response.addClass('ligne_resultat_fixed');
        var resval = $('<span />').appendTo(response);
        resval.text('Vérification en cours...');
        return response;
    }

    function updatePosition() {
        if (chip_serial === '') {
            return false;
        }
        if ($('#lieu_actuel .titre1').text() === 'Dans la rue') {
            socket.emit('noposition');
        } else {
            socket.emit('position', {
                position: $('#lieu_actuel .titre2').text(),
                timestamp: new Date().getTime()
            });
        }
    }

    function interceptDeckCommand(data) {
        var $span = genResponseLine();
        $('.deck_main .zone_ecrit').append($span);
        if (data[1]) {
            socket.emit('activate', {
                serial: data[1],
                timestamp: new Date().getTime()
            }, function (databack) {
                if (!databack.error) {
                    chip_serial = data[1];
                    $('#mysouthchip').show();
                    $('#mysouthchip').css({
                        "background": databack.color
                    });
                    $('#mysouthchip').attr('title', databack.chip_title);
                }
                updatePosition();
                $span.text(databack.message);
            });
        }
    }

    window.addEventListener('focus', function () {
        hasFocus = true;
    });

    window.addEventListener('blur', function () {
        hasFocus = false;
    });

    $(document).ajaxComplete(function (event, xhr, settings) {
        if (settings.url === "http://www.dreadcast.net/Check") {
            return false;
        }
        if (settings.url === "Deck/Command") {
            var parse_data = parsePostData(settings.data);
            var matched = parse_data.commande.match(chip_cmd_filter);
            if (matched) {
                interceptDeckCommand(chip_cmd_filter.exec(parse_data.commande));
            }
        }
        updatePosition();
    });
})();