Farmerama - Outer log

Outer log

// ==UserScript==
// @name         Farmerama - Outer log
// @namespace    scriptomatika
// @author       mouse-karaganda
// @description  Outer log
// @license      MIT
// @match        https://www.farmerama.com/?action=internalGameUnity*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=farmerama.com
// @version      1.5
// @grant        none


// ==/UserScript==

(function() {
    document.title = "Система электронного документооборота";
    console.log('Userscript run at == ', location.href);

    let $ = jQuery;
    let _console = {
        //listenDiv: '#gameContent',
        listenDiv: '#unity-container',
        //listenDiv: '#unity-canvas',

        boxClass: 'consoleBox',
        displayClass: 'consoleNotDisplay',
        get boxSelector() {
            return '#' + this.boxClass;
        },

        createStyle: function() {
            let styleContent = [
                '#consoleBox { position: fixed; z-index: 10000; bottom: 0; right: 0; }',
                '#consoleBox .consoleToolbar { position: absolute; }',
                '#consoleBox .consoleButton { display: inline-block; background: yellow; margin: 0 5px 5px 0; padding: 5px 10px; border: 1px solid black; border-radius: 10px; cursor: pointer; white-space: nowrap; }',
                '#consoleBox .consoleButton:hover { background: white; }',
                '#consoleBox .consoleClose { top: 5px; right: 0; }',
                '#consoleBox .consoleOpen { bottom: 0; right: 0; }',
                '#consoleBox .consoleOuter { position: relative; padding: 37px 20px 5px 5px; background: #97b318; border: 3px double black; border-width: 3px 0 0 3px; border-radius: 15px 0 0 0; }',
                '#consoleBox .consoleInner { width: 500px; height: 350px; overflow: auto; font-family: monospace; }',
                '#consoleBox .consoleNotDisplay { display: none; }'
            ];
            $('<style type="text/css" />').appendTo('head').text(styleContent.join('\n'));
        },

        createPanel: function() {
            let _this = this;
            let box = $('<div />').attr('id', _this.boxClass).appendTo('body');
            _this.outer = $('<div class="consoleOuter" />').appendTo(box)
                .addClass(_this.displayClass);
            _this.inner = $('<div class="consoleInner" />').appendTo(_this.outer);

            let toolbarClose = $('<div class="consoleToolbar consoleClose" />').appendTo(_this.outer);
            _this.btnAdd = $('<div class="consoleButton" />').appendTo(toolbarClose).text('Add map')
                .attr('title', 'Добавить карту')
                .on('click', _this.addMap);
            _this.btnDel = $('<div class="consoleButton" />').appendTo(toolbarClose).text('Del map')
                .attr('title', 'Удалить карту')
                .on('click', _this.delMap);
            _this.btnStop = $('<div class="consoleButton" />').appendTo(toolbarClose).text('Stop map').hide()
                .attr('title', 'Остановить запись карты')
                .on('click', _this.stopMap);
            let btnTrigger = $('<div class="consoleButton" />').appendTo(toolbarClose).text('Trigger').hide()
                .attr('title', 'Имитация')
                .on('click', _this.triggerOne);
            let btnTrash = $('<div class="consoleButton" />').appendTo(toolbarClose).text('🗑️')
                .attr('title', 'Очистить консоль')
                .on('click', _this.clearPanel);
            let btnClose = $('<div class="consoleButton" />').appendTo(toolbarClose).text('🗙')
                .attr('title', 'Закрыть консоль')
                .on('click', _this.togglePanel);

            _this.toolbarOpen = $('<div class="consoleToolbar consoleOpen" />').appendTo(box);
            let btnOpen = $('<div class="consoleButton" />').appendTo(_this.toolbarOpen).text('Open log')
                .attr('title', 'Открыть консоль')
                .on('click', _this.togglePanel);
        },

        togglePanel: function(eventObj) {
            let _this = _console;
            _this.outer.toggleClass(_this.displayClass);
            _this.toolbarOpen.toggleClass(_this.displayClass);
        },

        clearPanel: function(eventObj) {
            let _this = _console;
            _this.inner.html('');
        },

        createListener: function() {
            let _this = _console;
            $(_this.listenDiv).on('click', function(eventObj) {
                let e = eventObj.originalEvent;
                let logEvent = { empty: 0 };
                if (e) {
                    if (false) {
                        logEvent = {};
                        for (let name in e) {
                            logEvent[name] = e[name];
                        }
                    } else {
                        logEvent = {
                            screenX: e.screenX,
                            screenY: e.screenY,
                            timeStamp: e.timeStamp,
                            clientX: e.clientX,
                            clientY: e.clientY,
                            pageX: e.pageX,
                            pageY: e.pageY,
                            //altKey: e.altKey,
                            //ctrlKey: e.ctrlKey,
                            //shiftKey: e.shiftKey,
                            //buttons: e.buttons,
                            //button: e.button,
                        };
                    }
                }
                _console.logObj(logEvent);
            });
        },

        triggerOne: function() {
            let _this = _console;
            let newEvent;

            if (false) {
                newEvent = $.Event('click');
                newEvent.pageX = 832;
                newEvent.pageY = 487;
                $(_this.listenDiv).trigger(newEvent);
            } else {
                newEvent = new MouseEvent('click', {
                    bubbles: true,
                    view: window,
                    buttons: 1,
                    button: 0,
                    clientX: 718,
                    clientY: 331,
                    //pageX: 718,
                    //pageY: 545,
                    screenX: 718,
                    screenY: 444
                });
                $(_this.listenDiv).get(0).dispatchEvent(newEvent);
            }
        },

        addMap: function() {
            let _this = _console;

            let fieldMapValue = localStorage["fieldMap"];
            if (!fieldMapValue) {
                fieldMapValue = '{}';
            }
            try {
                _this.fieldMap = JSON.parse(fieldMapValue);
            } catch (e) {
                _this.logObj({ error: e.message });
                return;
            }

            let nameList = [];
            for (let name in _this.fieldMap) {
                nameList.push(name);
            }
             _this.logObj({ nameList: nameList });

            setTimeout(_this.chooseMap, 200);
        },

        chooseMap: function() {
            let _this = _console;

            let mapName = prompt("Введите имя для карты", "Новая карта");
            if (!mapName || mapName.trim() == "") {
                return;
            }
            if (mapName in _this.fieldMap) {
                let confirmMapName = confirm(`Карта [${mapName}] уже существует.\nВы действительно хотите заменить её?`);
                if (!confirmMapName) {
                    return;
                }
            }

            // Готовимся к записи карты
            _this.btnAdd.hide();
            _this.btnStop.show();

            _this.log(`Началась запись карты [${mapName}]`);
            _this.mapName = mapName;
            _this.fieldMap[mapName] = [];
            $(_this.listenDiv).on('click', _this.writeToMap);
        },

        writeToMap: function(eventObj) {
            let _this = _console;
            let e = eventObj.originalEvent;
            let newPoint = {
                screenX: e.screenX,
                screenY: e.screenY,
                timeStamp: e.timeStamp,
                timeAfter: 0
            };
            let currentLen = _this.fieldMap[_this.mapName].length;
            if (currentLen > 0) {
                newPoint.timeAfter = (newPoint.timeStamp - _this.fieldMap[_this.mapName][currentLen - 1].timeStamp);
            }
            _this.fieldMap[_this.mapName].push(newPoint);
        },

        stopMap: function() {
            let _this = _console;
            $(_this.listenDiv).off('click', _this.writeToMap);

            _this.logObj(_this.fieldMap);
            localStorage["fieldMap"] = JSON.stringify(_this.fieldMap);
            _this.log(`Остановлена запись карты [${_this.mapName}]`);
            delete _this.mapName;
            delete _this.fieldMap;

            _this.btnAdd.show();
            _this.btnStop.hide();
        },

        delMap: function() {
        },

        log: function(addText) {
            let _this = this;
            $('<p />').appendTo(_this.inner).text(addText);
            let ruler = $('<hr />').appendTo(_this.inner);
            ruler.get(0).scrollIntoView();
        },

        logObj: function(obj) {
            this.log(JSON.stringify(obj, null, 2));
        },

        start: function() {
            this.createStyle();
            this.createPanel();
            this.createListener();
        }
    };
    _console.start();
})();