// ==UserScript==
// @name InstaSynchP Autocomplete
// @namespace InstaSynchP
// @description Autocomplete emotes, commands and others for the chat
// @version 1.1.1
// @author Zod-
// @source https://github.com/Zod-/InstaSynchP-Autocomplete
// @license MIT
// @include *://instasync.com/r/*
// @include *://*.instasync.com/r/*
// @grant none
// @run-at document-start
// @require https://greasyfork.org/scripts/5647-instasynchp-library/code/InstaSynchP%20Library.js?version=37716
// ==/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: 'Autocomplete chat commands starting with \'',
id: 'autocomplete-commands',
type: 'checkbox',
'default': true,
section: ['Chat', 'Autocomplete']
}, {
label: 'Autocomplete emotes starting with /',
id: 'autocomplete-emotes',
type: 'checkbox',
'default': true,
section: ['Chat', 'Autocomplete']
}, {
label: 'Sort the results of the autocomplete',
id: 'autocomplete-sort',
type: 'checkbox',
'default': true,
section: ['Chat', 'Autocomplete']
}, {
label: '# of results shown in the autocomplete',
id: 'autocomplete-results',
type: 'int',
min: 0,
'default': 7,
size: 1,
section: ['Chat', 'Autocomplete']
}];
this.styles = [{
name: 'autocomplete',
url: 'https://cdn.rawgit.com/Zod-/InstaSynchP-Autocomplete/b3812c5c3f27a72ff36d5f130b8e20ee96cad2ee/jquery-ui.css',
autoload: true
}];
}
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' && !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) {
logger().error(th.name, "Source Error", 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) {
logger().error(th.name, "Select Error", 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.1.1');