InstaSynchP Autocomplete

Autocompletes emotes

Versione datata 19/02/2015. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name        InstaSynchP Autocomplete
// @namespace   InstaSynchP
// @description Autocompletes emotes

// @version     1.0.5
// @author      Zod-
// @source      https://github.com/Zod-/InstaSynchP-Autocomplete
// @license     MIT

// @include     http://*.instasynch.com/*
// @include     http://instasynch.com/*
// @include     http://*.instasync.com/*
// @include     http://instasync.com/*
// @grant       none
// @run-at      document-start

// @require     https://greasyfork.org/scripts/5647-instasynchp-library/code/InstaSynchP%20Library.js
// ==/UserScript==

function Autocomplete(version) {
    "use strict";
    this.version = version;
    this.name = 'InstaSynchP Autocomplete';
    this.menuActive = false;
    this.autocompleteEnabled = true;
    this.sources = [];
    this.selects = [];
    this.settings = [{
        'label': 'Commands',
        'id': 'autocomplete-commands',
        'type': 'checkbox',
        'default': true,
        'section': ['Chat', 'Autocomplete']
    }, {
        'label': 'Emotes',
        'id': 'autocomplete-emotes',
        'type': 'checkbox',
        'default': true,
        'section': ['Chat', 'Autocomplete']
    }, {
        'label': 'Sort results',
        'id': 'autocomplete-sort',
        'type': 'checkbox',
        'default': true,
        'section': ['Chat', 'Autocomplete']
    }, {
        'label': '# of results',
        'id': 'autocomplete-results',
        'type': 'int',
        'min': 0,
        'default': 7,
        'size': 1,
        'section': ['Chat', 'Autocomplete']
    }];
}

Autocomplete.prototype.resetVariables = function () {
    "use strict";
    this.menuActive = false;
    this.autocompleteEnabled = true;
};

Autocomplete.prototype.addSource = function (source, select) {
    "use strict";
    this.sources.push(source);
    this.selects.push(select);
};

Autocomplete.prototype.executeOnce = function () {
    "use strict";
    var th = this;
    events.on(th, 'InputKeydown[9]', function (event) {
        if (!th.menuActive) {
            return;
        }
        event.keyCode = $.ui.keyCode.ENTER;
        $(this).trigger(event);
    });
    //emotes
    th.addSource(function (term) {
            if (!gmc.get('autocomplete-emotes')) {
                return [];
            }
            var lastIndex = term.lastIndexOf('/'),
                partToComplete = term.substring(lastIndex, term.length).toLowerCase();
            return $.map(Object.keys(window.$codes), function (item) {
                item = '/' + item;
                if (item.toLowerCase().startsWith(partToComplete)) {
                    return item;
                }
            });
        },
        function (val, item) {
            //check if emote is at the beginning of the input
            if (window.$codes[item.substring(1, item.length)]) {
                return val.lastIndexOf(item) === 0;
            }
            return false;
        }
    );

    //commands
    th.addSource(function (term) {
            term = term.toLowerCase();
            if (!gmc.get('autocomplete-commands')) {
                return [];
            }
            return $.map(Object.keys(commands.getAll()), function (item) {
                var command = commands.get(item);
                if (item.startsWith(term)) {
                    if (command.type === 'mod' && !window.isMod) {
                        return undefined;
                    }
                    return command.name;
                }
            });
        },
        function (val, item) {
            var command = commands.get(item);
            if (command) {
                return val.lastIndexOf(item) === 0 && !command.hasArguments;
            }
            return false;
        }
    );

    events.on(th, 'InputKeydown', function (event) {
        if (event.keyCode !== 40 && event.keyCode !== 38) {
            th.autocompleteEnabled = true;
        }
    });
};

Autocomplete.prototype.preConnect = function () {
    "use strict";
    var th = this;
    //add the jquery autcomplete widget to InstaSynch's input field
    $("#cin").autocomplete({
        delay: 0,
        minLength: 0,
        source: function (request, response) {
            var result = [],
                i,
                words = request.term.split(' '),
                last = words[words.length - 1];
            //return if autocomplete has been turned off by other plugins
            if (!th.autocompleteEnabled || last.length === 0 || request.term.length !== $('#cin')[0].selectionStart) {
                response(result);
                return;
            }
            for (i = 0; i < th.sources.length; i += 1) {
                try {
                    result = result.concat(th.sources[i].apply(this, [last]));
                } catch (err) {
                    window.console.log(err);
                }
            }
            if (gmc.get('autocomplete-sort')) {
                result.sort();
            }

            response(result.slice(0, gmc.get('autocomplete-results')));
        },
        select: function (event, ui) {
            var val = this.value,
                uiVal = ui.item.value,
                i,
                instant = false;
            this.value = val.substring(0, val.lastIndexOf(uiVal[0])) + uiVal;

            for (i = 0; i < th.selects.length; i += 1) {
                try {
                    //check if the item can be sent instantly
                    if (th.selects[i].apply(this, [this.value, uiVal])) {
                        instant = true;
                        break;
                    }
                } catch (err) {
                    window.console.log(err);
                }
            }
            if (instant) {
                $(this).trigger(
                    $.Event('keypress', {
                        which: 13,
                        keyCode: 13
                    })
                );
            } else {
                this.value = this.value + ' ';
            }
            return false;
        },
        autoFocus: true,
        focus: function () {
            return false;
        },
        close: function () {
            th.menuActive = false;
        },
        open: function () {
            th.menuActive = true;
        }
    }).on('paste', function () {
        th.autocompleteEnabled = false;
    });
};

window.plugins = window.plugins || {};
window.plugins.autocomplete = new Autocomplete('1.0.5');