init commit

This commit is contained in:
zino
2021-02-16 23:07:41 +01:00
parent ec3fc78e0f
commit 12b4ef5db4
5000 changed files with 2596132 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* This script is for announcing bits from Twitch, and rewarding the user with points if the caster wants too.
*
*/
(function () {
var toggle = $.getSetIniDbBoolean('bitsSettings', 'toggle', false),
message = $.getSetIniDbString('bitsSettings', 'message', '(name) just cheered (amount) bits!'),
minimum = $.getSetIniDbNumber('bitsSettings', 'minimum', 0),
announceBits = false;
/*
* @function reloadBits
*/
function reloadBits() {
toggle = $.getIniDbBoolean('bitsSettings', 'toggle', false);
message = $.getIniDbString('bitsSettings', 'message', '(name) just cheered (amount) bits!');
minimum = $.getIniDbNumber('bitsSettings', 'minimum', 0);
}
/*
* @event twitchBits
*/
$.bind('twitchBits', function (event) {
var username = event.getUsername(),
bits = event.getBits(),
ircMessage = event.getMessage(),
emoteRegexStr = $.twitch.GetCheerEmotesRegex(),
s = message;
if (announceBits === false || toggle === false) {
return;
}
if (bits == 1) {
s = $.replace(s, 'bits', 'bit');
}
if (s.match(/\(name\)/g)) {
s = $.replace(s, '(name)', username);
}
if (s.match(/\(amount\)/g)) {
s = $.replace(s, '(amount)', bits);
}
if (s.match(/\(message\)/g)) {
s = $.replace(s, '(message)', ircMessage);
if (emoteRegexStr.length() > 0) {
emoteRegex = new RegExp(emoteRegexStr, 'gi');
s = String(s).valueOf();
s = s.replace(emoteRegex, '');
}
}
if (bits >= minimum) {
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
if (s == '') {
return null;
}
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (s == '') {
return null;
}
}
$.say(s);
}
$.writeToFile(username + ' ', './addons/bitsHandler/latestCheer.txt', false);
$.writeToFile(username + ': ' + bits + ' ', './addons/bitsHandler/latestCheer&Bits.txt', false);
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
argsString = event.getArguments(),
action = args[0];
/*
* @commandpath bitstoggle - Toggles the bits announcements.
*/
if (command.equalsIgnoreCase('bitstoggle')) {
toggle = !toggle;
$.setIniDbBoolean('bitsSettings', 'toggle', toggle);
$.say($.whisperPrefix(sender) + (toggle ? $.lang.get('bitshandler.toggle.on') : $.lang.get('bitshandler.toggle.off')))
}
/*
* @commandpath bitsmessage - Sets a message for when someone cheers bits.
*/
if (command.equalsIgnoreCase('bitsmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('bitshandler.message.usage'));
return;
}
message = argsString;
$.setIniDbString('bitsSettings', 'message', message);
$.say($.whisperPrefix(sender) + $.lang.get('bitshandler.message.set', message));
}
/*
* @commandpath bitsminimum - Set how many bits someone needs to cheer before announcing it.
*/
if (command.equalsIgnoreCase('bitsminimum')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('bitshandler.minimum.usage'));
return;
}
minimum = parseInt(action);
$.setIniDbNumber('bitsSettings', 'minimum', minimum);
$.say($.whisperPrefix(sender) + $.lang.get('bitshandler.minimum.set', minimum));
$.log.event(sender + ' changed the bits minimum to: ' + minimum + ' bits.');
}
});
/*
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/bitsHandler.js', 'bitstoggle', 1);
$.registerChatCommand('./handlers/bitsHandler.js', 'bitsmessage', 1);
$.registerChatCommand('./handlers/bitsHandler.js', 'bitsminimum', 1);
announceBits = true;
});
$.reloadBits = reloadBits;
})();

View File

@@ -0,0 +1,607 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* This module is to handle channel point redemption actions
* Author: MzLiv
*/
(function () {
var transferToggle = $.getSetIniDbBoolean('channelPointsSettings', 'transferToggle', false),
transferAmount = $.getSetIniDbNumber('channelPointsSettings', 'transferAmount', 0),
transferID = $.getSetIniDbString('channelPointsSettings', 'transferID', 'noIDSet'),
transferConfig = $.getSetIniDbBoolean('channelPointsSettings', 'transferConfig', false),
transferReward = $.getSetIniDbString('channelPointsSettings', 'transferReward', 'noNameSet'),
giveAllToggle = $.getSetIniDbBoolean('channelPointsSettings', 'giveAllToggle', false),
giveAllAmount = $.getSetIniDbNumber('channelPointsSettings', 'giveAllAmount', 0),
giveAllID = $.getSetIniDbString('channelPointsSettings', 'giveAllID', 'noIDSet'),
giveAllConfig = $.getSetIniDbBoolean('channelPointsSettings', 'giveAllConfig', false),
giveAllReward = $.getSetIniDbString('channelPointsSettings', 'giveAllReward', 'noNameSet'),
emoteOnlyToggle = $.getSetIniDbBoolean('channelPointsSettings', 'emoteOnlyToggle', false),
emoteOnlyDuration = $.getSetIniDbNumber('channelPointsSettings', 'emoteOnlyDuration', 0),
emoteOnlyID = $.getSetIniDbString('channelPointsSettings', 'emoteOnlyID', 'noIDSet'),
emoteOnlyConfig = $.getSetIniDbBoolean('channelPointsSettings', 'emoteOnlyConfig', false),
emoteOnlyReward = $.getSetIniDbString('channelPointsSettings', 'emoteOnlyReward', 'noNameSet'),
emoteOnlyStart = $.systemTime(),
emoteOnlyMode = $.getSetIniDbBoolean('channelPointsSettings', 'timeoutToggle', false),
timeoutToggle = $.getSetIniDbBoolean('channelPointsSettings', 'timeoutToggle', false),
timeoutDuration = $.getSetIniDbNumber('channelPointsSettings', 'timeoutDuration', 0),
timeoutID = $.getSetIniDbString('channelPointsSettings', 'timeoutID', 'noIDSet'),
timeoutConfig = $.getSetIniDbBoolean('channelPointsSettings', 'timeoutConfig', false),
timeoutReward = $.getSetIniDbString('channelPointsSettings', 'timeoutReward', 'noNameSet'),
pointName = $.pointNameMultiple;
/*
* @function updateChannelPointsConfig
*/
function updateChannelPointsConfig() {
transferToggle = $.getIniDbBoolean('channelPointsSettings', 'transferToggle', false);
transferAmount = $.getIniDbNumber('channelPointsSettings', 'transferAmount', 0);
transferID = $.getIniDbString('channelPointsSettings', 'transferID', 'noIDSet');
transferConfig = $.getIniDbBoolean('channelPointsSettings', 'transferConfig', false);
transferReward = $.getIniDbString('channelPointsSettings', 'transferReward', 'noNameSet');
giveAllToggle = $.getIniDbBoolean('channelPointsSettings', 'giveAllToggle', false);
giveAllAmount = $.getIniDbNumber('channelPointsSettings', 'giveAllAmount', 0);
giveAllID = $.getIniDbString('channelPointsSettings', 'giveAllID', 'noIDSet');
giveAllConfig = $.getIniDbBoolean('channelPointsSettings', 'giveAllConfig', false);
giveAllReward = $.getIniDbString('channelPointsSettings', 'giveAllReward', 'noNameSet');
emoteOnlyMode = $.getIniDbBoolean('channelPointsSettings', 'timeoutToggle', false),
emoteOnlyToggle = $.getIniDbBoolean('channelPointsSettings', 'emoteOnlyToggle', false);
emoteOnlyDuration = $.getIniDbNumber('channelPointsSettings', 'emoteOnlyDuration', 0);
emoteOnlyID = $.getIniDbString('channelPointsSettings', 'emoteOnlyID', 'noIDSet');
emoteOnlyConfig = $.getIniDbBoolean('channelPointsSettings', 'emoteOnlyConfig', false);
emoteOnlyReward = $.getIniDbString('channelPointsSettings', 'emoteOnlyReward', 'noNameSet');
timeoutToggle = $.getIniDbBoolean('channelPointsSettings', 'timeoutToggle', false);
timeoutDuration = $.getIniDbNumber('channelPointsSettings', 'timeoutDuration', 0);
timeoutID = $.getIniDbString('channelPointsSettings', 'timeoutID', 'noIDSet');
timeoutConfig = $.getIniDbBoolean('channelPointsSettings', 'timeoutConfig', false);
timeoutReward = $.getIniDbString('channelPointsSettings', 'timeoutReward', 'noNameSet');
}
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0];
if (command.equalsIgnoreCase('channelpoints')) {
if (action === undefined) {
if (transferToggle === false && giveAllToggle === false && emoteOnlyToggle === false && timeoutToggle === false) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.notenabled'));
return;
}
var config = '';
if (transferToggle === true) {
config += ' transfer';
}
if (giveAllToggle === true) {
config += ' giveall';
}
if (emoteOnlyToggle === true) {
config += ' emoteonly';
}
if (timeoutToggle === true) {
config += ' timeout';
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.current', config));
return;
}
/*
* @commandpath usage
*/
if (action.equalsIgnoreCase('usage')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.usage'));
return;
}
/*
* @commandpath info
*/
if (action.equalsIgnoreCase('info')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.info'));
return;
}
/*
* @commandpath transfer
*/
if (action.equalsIgnoreCase('transfer')) {
if (args[1] === undefined) {
if (transferToggle === false) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.info'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.current', transferReward, transferAmount));
return;
}
/*
* @commandpath transfer usage
*/
if (args[1].equalsIgnoreCase('usage')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.usage'));
return;
}
/*
* @commandpath transfer config
*/
if (args[1].equalsIgnoreCase('config')) {
transferConfig = !transferConfig;
$.setIniDbBoolean('channelPointsSettings', 'transferConfig', transferConfig);
if (transferConfig === true){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.config.start'));
transferID = 'noIDSet';
transferReward = 'noNameSet';
$.setIniDbBoolean('channelPointsSettings', 'transferID', transferID);
$.setIniDbBoolean('channelPointsSettings', 'transferReward', transferReward);
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.config.failed'));
// config is closed when reward is successfully redeemed please see reward ID config in channel point events below
return;
}
/*
* @commandpath transfer amount
*/
if (args[1].equalsIgnoreCase('amount')) {
if (args[2] === undefined) {
if (transferAmount === 0){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.amount.notset'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.amount.usage', transferAmount));
return;
}
if (isNaN(args[2])) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.nan'));
return;
}
transferAmount = args[2];
$.setIniDbNumber('channelPointsSettings', 'transferAmount', transferAmount);
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.amount.message', transferAmount));
}
/*
* @commandpath transfer toggle
*/
if (args[1].equalsIgnoreCase('toggle')) {
if (transferToggle === false){
if (transferID.equals('noIDSet')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.toggle.id'));
return;
}
if (transferAmount === 0){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.transfer.toggle.amount'));
return;
}
}
transferToggle = !transferToggle;
$.setIniDbBoolean('channelPointsSettings', 'transferToggle', transferToggle);
$.say($.whisperPrefix(sender) + (transferToggle ? $.lang.get('channelPointsHandler.transfer.enabled', transferReward) : $.lang.get('channelPointsHandler.transfer.disabled')));
return;
}
}
/*
* @commandpath giveall
*/
if (action.equalsIgnoreCase('giveall')) {
if (args[1] === undefined) {
if (giveAllToggle === false) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.info'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.current', giveAllReward, giveAllAmount));
return;
}
/*
* @commandpath giveall usage
*/
if (args[1].equalsIgnoreCase('usage')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.usage'));
return;
}
/*
* @commandpath giveall config
*/
if (args[1].equalsIgnoreCase('config')) {
giveAllConfig = !giveAllConfig;
$.setIniDbBoolean('channelPointsSettings', 'giveAllConfig', giveAllConfig);
if (giveAllConfig === true) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.config.start'));
giveAllID = 'noIDSet';
giveAllReward = 'noNameSet';
$.setIniDbBoolean('channelPointsSettings', 'giveAllID', giveAllID);
$.setIniDbBoolean('channelPointsSettings', 'giveAllReward', giveAllReward);
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.config.failed'));
// config is closed when reward is successfully redeemed please see reward ID config in channel point events below
return;
}
/*
* @commandpath giveall amount
*/
if (args[1].equalsIgnoreCase('amount')) {
if (args[2] === undefined) {
if (giveAllAmount === 0) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.amount.notset'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.amount.usage', giveAllAmount));
return;
}
if (isNaN(args[2])) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.nan'));
return;
}
giveAllAmount = args[2];
$.setIniDbNumber('channelPointsSettings', 'giveallAmount', giveAllAmount);
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.amount.message', giveAllAmount));
}
/*
* @commandpath giveall toggle
*/
if (args[1].equalsIgnoreCase('toggle')) {
if (giveAllToggle === false) {
if (giveAllID.equals('noIDSet')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.toggle.id'));
return;
}
if (giveAllAmount === 0) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.giveall.toggle.amount'));
return;
}
}
giveAllToggle = !giveAllToggle;
$.setIniDbBoolean('channelPointsSettings', 'giveallToggle', giveAllToggle);
$.say($.whisperPrefix(sender) + (giveAllToggle ? $.lang.get('channelPointsHandler.giveall.enabled', giveAllReward) : $.lang.get('channelPointsHandler.giveall.disabled')));
return;
}
}
/*
* @commandpath emoteonly
*/
if (action.equalsIgnoreCase('emoteonly')) {
if (args[1] === undefined) {
if (emoteOnlyToggle === false) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.info'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.current', emoteOnlyReward, emoteOnlyDuration));
return;
}
/*
* @commandpath emoteonly usage
*/
if (args[1].equalsIgnoreCase('usage')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.usage'));
return;
}
/*
* @commandpath emoteonly config
*/
if (args[1].equalsIgnoreCase('config')) {
emoteOnlyConfig = !emoteOnlyConfig;
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyConfig', emoteOnlyConfig);
if (emoteOnlyConfig === true){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.config.start'));
emoteOnlyID = 'noIDSet';
emoteOnlyReward = 'noNameSet';
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyID', emoteOnlyID);
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyReward', emoteOnlyReward);
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.config.failed'));
// config is closed when reward is successfully redeemed please see reward ID config in channel point events below
return;
}
/*
* @commandpath emoteonly duration
*/
if (args[1].equalsIgnoreCase('duration')) {
if (args[2] === undefined) {
if (emoteOnlyDuration === 0){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.duration.notset'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.duration.usage', emoteOnlyDuration));
return;
}
if (isNaN(args[2])) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.nan'));
return;
}
emoteOnlyDuration = args[2];
$.setIniDbNumber('channelPointsSettings', 'emoteOnlyDuration', emoteOnlyDuration);
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.duration.message', emoteOnlyDuration));
}
/*
* @commandpath emoteonly toggle
*/
if (args[1].equalsIgnoreCase('toggle')) {
if (emoteOnlyToggle === false){
if (emoteOnlyID.equals('noIDSet')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.toggle.id'));
return;
}
if (emoteOnlyDuration === 0){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.emoteonly.toggle.duration'));
return;
}
}
emoteOnlyToggle = !emoteOnlyToggle;
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyToggle', emoteOnlyToggle);
$.say($.whisperPrefix(sender) + (emoteOnlyToggle ? $.lang.get('channelPointsHandler.emoteonly.enabled', emoteOnlyReward) : $.lang.get('channelPointsHandler.emoteonly.disabled')));
return;
}
}
/*
* @commandpath timeout
*/
if (action.equalsIgnoreCase('timeout')) {
if (args[1] === undefined) {
if (timeoutToggle === false) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.info'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.current', timeoutReward, timeoutDuration));
return;
}
/*
* @commandpath timeout usage
*/
if (args[1].equalsIgnoreCase('usage')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.usage'));
return;
}
/*
* @commandpath timeout config
*/
if (args[1].equalsIgnoreCase('config')) {
timeoutConfig = !timeoutConfig;
$.setIniDbBoolean('channelPointsSettings', 'timeoutConfig', timeoutConfig);
if (timeoutConfig === true){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.config.start'));
timeoutID = 'noIDSet';
timeoutReward = 'noNameSet';
$.setIniDbBoolean('channelPointsSettings', 'timeoutID', timeoutID);
$.setIniDbBoolean('channelPointsSettings', 'timeoutReward', timeoutReward);
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.config.failed'));
// config is closed when reward is successfully redeemed please see reward ID config in channel point events below
return;
}
/*
* @commandpath timeout duration
*/
if (args[1].equalsIgnoreCase('duration')) {
if (args[2] === undefined) {
if (timeoutDuration === 0){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.duration.notset'));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.duration.usage', timeoutDuration));
return;
}
if (isNaN(args[2])) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.nan'));
return;
}
timeoutDuration = args[2];
$.setIniDbNumber('channelPointsSettings', 'timeoutDuration', timeoutDuration);
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.duration.message', timeoutDuration));
}
/*
* @commandpath timeout toggle
*/
if (args[1].equalsIgnoreCase('toggle')) {
if (timeoutToggle === false){
if (timeoutID.equals('noIDSet')) {
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.toggle.id'));
return;
}
if (timeoutDuration === 0){
$.say($.whisperPrefix(sender) + $.lang.get('channelPointsHandler.timeout.toggle.duration'));
return;
}
}
timeoutToggle = !timeoutToggle;
$.setIniDbBoolean('channelPointsSettings', 'timeoutToggle', timeoutToggle);
$.say($.whisperPrefix(sender) + (timeoutToggle ? $.lang.get('channelPointsHandler.timeout.enabled', timeoutReward) : $.lang.get('channelPointsHandler.timeout.disabled')));
return;
}
}
}
})
/*
* @event channelPointRedemptions
*/
$.bind('PubSubChannelPoints', function (event) {
var redemptionID = event.getRedemptionID(),
rewardID = event.getRewardID(),
userID = event.getUserID(),
username = event.getUsername(),
displayName = event.getDisplayName(),
rewardTitle = event.getRewardTitle(),
cost = event.getCost(),
inputPromt = event.getInputPrompt(),
userInput = event.getUserInput(),
fulfillmentStatus = event.getFulfillmentStatus();
com.gmt2001.Console.debug.println("Channel point event " + rewardTitle + " parsed to javascript." + " ID is: " + rewardID);
/*
* reward ID config
*/
if (transferConfig === true) {
transferID = rewardID;
transferReward = rewardTitle;
$.setIniDbBoolean('channelPointsSettings', 'transferID', transferID);
$.setIniDbBoolean('channelPointsSettings', 'transferReward', transferReward);
transferConfig = false;
$.setIniDbBoolean('channelPointsSettings', 'transferConfig', transferConfig);
$.say($.lang.get('channelPointsHandler.transfer.config.complete', transferReward));
return;
}
if (giveAllConfig === true) {
giveAllID = rewardID;
giveAllReward = rewardTitle;
$.setIniDbBoolean('channelPointsSettings', 'giveAllID', giveAllID);
$.setIniDbBoolean('channelPointsSettings', 'giveAllReward', giveAllReward);
giveAllConfig = false;
$.setIniDbBoolean('channelPointsSettings', 'giveAllConfig', giveAllConfig);
$.say($.lang.get('channelPointsHandler.giveAll.config.complete', giveAllReward));
return;
}
if (emoteOnlyConfig === true) {
emoteOnlyID = rewardID;
emoteOnlyReward = rewardTitle;
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyID', emoteOnlyID);
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyReward', emoteOnlyReward);
emoteOnlyConfig = false;
$.setIniDbBoolean('channelPointsSettings', 'emoteOnlyConfig', emoteOnlyConfig);
$.say($.lang.get('channelPointsHandler.emoteOnly.config.complete', emoteOnlyReward));
return;
}
if (timeoutConfig === true) {
if (userInput.equals('')){
$.say($.lang.get('channelPointsHandler.timeout.nouserinput'));
timeoutConfig = false;
$.setIniDbBoolean('channelPointsSettings', 'timeoutConfig', timeoutConfig);
return;
}
timeoutID = rewardID;
timeoutReward = rewardTitle;
$.setIniDbBoolean('channelPointsSettings', 'timeoutID', timeoutID);
$.setIniDbBoolean('channelPointsSettings', 'timeoutReward', timeoutReward);
timeoutConfig = false;
$.setIniDbBoolean('channelPointsSettings', 'timeoutConfig', timeoutConfig);
$.say($.lang.get('channelPointsHandler.timeout.config.complete', timeoutReward));
return;
}
/*
* transfer
*/
if (rewardID.equals(transferID)){
if (transferToggle === true){
com.gmt2001.Console.debug.println("transferRunStart");
if (transferAmount < 2){
pointName = $.pointNameSingle;
}
else{
pointName = $.pointNameMultiple;
}
$.inidb.incr('points', username, transferAmount);
$.say($.whisperPrefix(displayName) + ' you have been awarded ' + transferAmount + ' ' + pointName + ' by redeeming ' + rewardTitle);
return;
}
}
/*
* give all
*/
if (rewardID.equals(giveAllID)){
if (giveAllToggle === true){
com.gmt2001.Console.debug.println("giveAllRunStart");
$.giveAll(giveAllAmount, displayName);
return;
}
}
/*
* emote only
*/
if (rewardID.equals(emoteOnlyID)){
if (emoteOnlyToggle ===true){
com.gmt2001.Console.debug.println("emoteOnlyRunStart" + emoteOnlyDuration);
$.say('/emoteonly');
setTimeout(emoteOnlyOff, emoteOnlyDuration * 1e3);
return;
}
}
/*
* timeout
*/
if (rewardID.equals(timeoutID)){
if (timeoutToggle === true) {
com.gmt2001.Console.debug.println("timeoutRunStart");
userInput = $.user.sanitize(userInput);
$.say('/timeout ' + userInput + ' ' + timeoutDuration);
$.say(userInput + ' has been timed out for ' + timeoutDuration + ' seconds by ' + displayName);
//TODO add check to ensure user is in chat
return;
}
}
});
/*
* add chat commands
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/channelPointsHandler.js', 'channelpoints', 1);
});
/*
* update API
*/
$.updateChannelPointsConfig = updateChannelPointsConfig();
})();
/*
* exit emote only mode after required time
*/
function emoteOnlyOff(){
$.say('/emoteonlyoff')
}

View File

@@ -0,0 +1,145 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Script : clipHandler.js
* Purpose : Configures the automatic display of clips in chat and captures the events from Twitch.
*/
(function () {
var toggle = $.getSetIniDbBoolean('clipsSettings', 'toggle', false),
message = $.getSetIniDbString('clipsSettings', 'message', '(name) created a clip: (url)');
/*
* @function reloadClips
*/
function reloadClips() {
toggle = $.getIniDbBoolean('clipsSettings', 'toggle', false);
message = $.getIniDbString('clipsSettings', 'message', '(name) created a clip: (url)');
}
/*
* @event twitchClip
*/
$.bind('twitchClip', function (event) {
var creator = event.getCreator(),
url = event.getClipURL(),
title = event.getClipTitle(),
s = message;
/* Even though the Core won't even query the API if this is false, we still check here. */
if (toggle === false) {
return;
}
if (s.match(/\(name\)/g)) {
s = $.replace(s, '(name)', creator);
}
if (s.match(/\(url\)/g)) {
s = $.replace(s, '(url)', url);
}
if (s.match(/\(title\)/g)) {
s = $.replace(s, '(title)', title);
}
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
if (s == '') {
return null;
}
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (s == '') {
return null;
}
}
$.say(s);
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
argsString = event.getArguments(),
action = args[0];
/*
* @commandpath clipstoggle - Toggles the clips announcements.
*/
if (command.equalsIgnoreCase('clipstoggle')) {
toggle = !toggle;
$.setIniDbBoolean('clipsSettings', 'toggle', toggle);
$.say($.whisperPrefix(sender) + (toggle ? $.lang.get('cliphandler.toggle.on') : $.lang.get('cliphandler.toggle.off')));
}
/*
* @commandpath clipsmessage - Sets a message for when someone creates a clip.
*/
if (command.equalsIgnoreCase('clipsmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('cliphandler.message.usage'));
return;
}
message = argsString;
$.setIniDbString('clipsSettings', 'message', message);
$.say($.whisperPrefix(sender) + $.lang.get('cliphandler.message.set', message));
}
/*
* @commandpath lastclip - Displays information about the last clip captured.
*/
if (command.equalsIgnoreCase('lastclip')) {
var url = $.getIniDbString('streamInfo', 'last_clip_url', $.lang.get('cliphandler.noclip'));
$.say($.whisperPrefix(sender) + $.lang.get('cliphandler.lastclip', url));
}
/*
* @commandpath topclip - Displays the top clip from the past day.
*/
if (command.equalsIgnoreCase('topclip')) {
var url = $.getIniDbString('streamInfo', 'most_viewed_clip_url', $.lang.get('cliphandler.noclip'));
$.say($.whisperPrefix(sender) + $.lang.get('cliphandler.topclip', url));
}
});
/*
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/clipHandler.js', 'clipstoggle', 1);
$.registerChatCommand('./handlers/clipHandler.js', 'clipsmessage', 1);
$.registerChatCommand('./handlers/clipHandler.js', 'lastclip', 7);
$.registerChatCommand('./handlers/clipHandler.js', 'topclip', 7);
});
$.reloadClips = reloadClips;
})();

View File

@@ -0,0 +1,266 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* donationHandler.js
*
* Detect and report donations from TwitchAlerts.
*/
(function () {
var announceDonations = $.getSetIniDbBoolean('donations', 'announce', false),
donationReward = $.getSetIniDbFloat('donations', 'reward', 0),
donationMessage = $.getSetIniDbString('donations', 'message', $.lang.get('donationhandler.donation.new')),
donationGroup = $.getSetIniDbBoolean('donations', 'donationGroup', false),
donationGroupMin = $.getSetIniDbNumber('donations', 'donationGroupMin', 5),
donationAddonDir = './addons/donationHandler',
announceDonationsAllowed = false;
/*
* @function donationpanelupdate
*/
function donationpanelupdate() {
announceDonations = $.getIniDbBoolean('donations', 'announce');
donationReward = $.getIniDbFloat('donations', 'reward');
donationMessage = $.getIniDbString('donations', 'message');
donationGroup = $.getIniDbBoolean('donations', 'donationGroup');
donationGroupMin = $.getIniDbNumber('donations', 'donationGroupMin');
}
/*
* @event streamLabsDonationInitialized
*/
$.bind('streamLabsDonationInitialized', function (event) {
if (!$.bot.isModuleEnabled('./handlers/donationHandler.js')) {
return;
}
if (!$.isDirectory(donationAddonDir)) {
$.consoleDebug('>> Creating Donation Handler Directory: ' + donationAddonDir);
$.mkDir(donationAddonDir);
}
$.consoleLn('>> Enabling StreamLabs donation announcements');
$.log.event('Donation announcements enabled');
announceDonationsAllowed = true;
});
/*
* @event streamLabsDonation
*/
$.bind('streamLabsDonation', function (event) {
if (!$.bot.isModuleEnabled('./handlers/donationHandler.js')) {
return;
}
var donationJsonStr = event.getJsonString(),
JSONObject = Packages.org.json.JSONObject,
donationJson = new JSONObject(donationJsonStr);
var donationID = donationJson.get("donation_id"),
donationCreatedAt = donationJson.get("created_at"),
donationCurrency = donationJson.getString("currency"),
donationAmount = parseFloat(donationJson.getString("amount")),
donationUsername = donationJson.getString("name"),
donationMsg = donationJson.getString("message");
if ($.inidb.exists('donations', donationID)) {
return;
}
$.inidb.set('streamInfo', 'lastDonator', $.username.resolve(donationUsername));
$.inidb.set('donations', donationID, donationJson);
$.inidb.set('donations', 'last_donation', donationID);
$.inidb.set('donations', 'last_donation_message', $.lang.get('main.donation.last.tip.message', donationUsername, donationCurrency, donationAmount.toFixed(2)));
$.writeToFile(donationUsername + ": " + donationAmount.toFixed(2) + " ", donationAddonDir + "/latestDonation.txt", false);
if (announceDonations && announceDonationsAllowed) {
var rewardPoints = Math.round(donationAmount * donationReward);
var donationSay = donationMessage;
donationSay = donationSay.replace('(name)', donationUsername);
donationSay = donationSay.replace('(amount)', donationAmount.toFixed(2));
donationSay = donationSay.replace('(amount.toFixed(0))', donationAmount.toFixed(0));
donationSay = donationSay.replace('(points)', rewardPoints.toString());
donationSay = donationSay.replace('(pointname)', (rewardPoints == 1 ? $.pointNameSingle : $.pointNameMultiple).toLowerCase());
donationSay = donationSay.replace('(currency)', donationCurrency);
donationSay = donationSay.replace('(message)', donationMsg);
if (donationSay.match(/\(alert [,.\w\W]+\)/g)) {
var filename = donationSay.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
donationSay = (donationSay + '').replace(/\(alert [,.\w\W]+\)/, '');
if (donationSay == '') {
return null;
}
}
if (donationSay.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(donationSay.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(donationSay.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
donationSay = $.replace(donationSay, donationSay.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (donationSay == '') {
return null;
}
}
$.say(donationSay);
}
if (donationGroup) {
$.inidb.incr('donations', donationUsername.toLowerCase(), parseInt(donationAmount.toFixed(2)));
if ($.inidb.exists('donations', donationUsername.toLowerCase()) && $.inidb.get('donations', donationUsername.toLowerCase()) >= donationGroupMin) {
if ($.getUserGroupId(donationUsername.toLowerCase()) > 3) {
$.setUserGroupById(donationUsername.toLowerCase(), '4');
}
}
}
if (rewardPoints > 0) {
$.inidb.incr('points', donationUsername.toLowerCase(), rewardPoints);
}
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender().toLowerCase(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0],
subAction = args[1];
/*
* @commandpath streamlabs - Controls various options for donation handling
*/
if (command.equalsIgnoreCase('streamlabs')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donations.usage'));
return;
}
/*
* @commandpath streamlabs toggledonators - Toggles the Donator's group.
*/
if (action.equalsIgnoreCase('toggledonators')) {
donationGroup = !donationGroup;
$.setIniDbBoolean('donations', 'donationGroup', donationGroup);
$.say($.whisperPrefix(sender) + (donationGroup ? $.lang.get('donationhandler.enabled.donators') : $.lang.get('donationhandler.disabled.donators')));
}
/*
* @commandpath streamlabs minmumbeforepromotion - Set the minimum before people get promoted to a Donator
*/
if (action.equalsIgnoreCase('minmumbeforepromotion')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donators.min.usage'));
return;
}
donationGroupMin = subAction;
$.setIniDbNumber('donations', 'donationGroupMin', donationGroupMin);
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donators.min', donationGroupMin));
}
/*
* @commandpath streamlabs announce - Toggles announcements for donations off and on
*/
if (action.equalsIgnoreCase('announce')) {
announceDonations = !announceDonations;
$.setIniDbBoolean('donations', 'announce', announceDonations);
$.say($.whisperPrefix(sender) + (announceDonations ? $.lang.get('donationhandler.donations.announce.enable') : $.lang.get('donationhandler.donations.announce.disable')));
}
/*
* @commandpath streamlabs rewardmultiplier [n.n] - Set a reward multiplier for donations.
*/
if (action.equalsIgnoreCase('rewardmultiplier')) {
if (isNaN(parseFloat(subAction))) {
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donations.reward.usage'));
return;
}
donationReward = parseFloat(subAction);
$.setIniDbFloat('donations', 'reward', donationReward);
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donations.reward.success', subAction, (subAction == "1" ? $.pointNameSingle : $.pointNameMultiple).toLowerCase()));
}
/*
* @commandpath streamlabs message [message text] - Set the donation message. Tags: (name), (amount), (points), (pointname), (message) and (currency)
*/
if (action.equalsIgnoreCase('message') || action.equalsIgnoreCase('lastmessage')) {
var comArg = action.toLowerCase();
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donations.message.usage'));
return;
}
var message = args.splice(1).join(' ');
if (message.search(/\(name\)/) === -1) {
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donations.message.no-name'));
return;
}
$.setIniDbString('donations', comArg, message);
donationMessage = $.getIniDbString('donations', 'message');
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.donations.message.success', message));
}
/*
* @commandpath streamlabs currencycode [currencycode] - Set a currency code to convert all Streamlabs donations to.
* @commandpath streamlabs currencycode erase - Removes the currency code.
*/
if (action.equalsIgnoreCase('currencycode')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.streamlabs.currencycode.usage'));
return;
}
if (subAction.equalsIgnoreCase('erase')) {
$.inidb.del('donations', 'currencycode');
Packages.com.illusionaryone.TwitchAlertsAPIv1.instance().SetCurrencyCode('');
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.streamlabs.currencycode.success-erase'));
} else {
$.setIniDbString('donations', 'currencycode', subAction);
Packages.com.illusionaryone.TwitchAlertsAPIv1.instance().SetCurrencyCode(subAction);
$.say($.whisperPrefix(sender) + $.lang.get('donationhandler.streamlabs.currencycode.success', subAction));
}
}
}
});
/**
* Registers commands once the bot is fully loaded.
*
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/donationHandler.js', 'streamlabs', 1);
});
$.donationpanelupdate = donationpanelupdate;
})();

View File

@@ -0,0 +1,172 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* emotesHandler.js
*
* Pull down emotes from Twitch, BetterTTV and FrankerZ.
*/
(function() {
var emotesRegExpList = [],
loaded = false;
// Load an existing emote RegExp cache. Wait to see if there was a problem that needs us to load
// from cache before doing so. This saves CPU cycles and memory.
setTimeout(function() {
if (emotesRegExpList.length === 0) {
loadEmoteCache();
}
}, 3e4, 'scripts::handlers::emotesHandler.js');
/**
* @event emotesGet
*/
$.bind('emotesGet', function(event) {
buildEmotesDB(event.getBttvEmotes(), event.getBttvLocalEmotes(), event.getFfzEmotes(), event.getFfzLocalEmotes());
});
/**
* @function buildEmotesDB
*/
function buildEmotesDB(bttvEmotes, bttvLocalEmotes, ffzEmotes, ffzLocalEmotes) {
var defaultSets = [],
jsonArray = [],
currentSet,
emote,
i, j,
emoteRegExp,
newEmotesRegExpList = [];
jsonArray = bttvEmotes.getJSONArray('data');
for (i = 0; i < jsonArray.length(); i++) {
emote = jsonArray.getJSONObject(i).getString('code');
// Check for emote at the beginning, middle and end of a string.
emoteRegExp = '\\b' + emote + '\\b';
newEmotesRegExpList.push(emoteRegExp);
}
if (bttvLocalEmotes.has('channelEmotes')) {
jsonArray = bttvLocalEmotes.getJSONArray('channelEmotes');
for (i = 0; i < jsonArray.length(); i++) {
emote = jsonArray.getJSONObject(i).getString('code');
// Check for emote at the beginning, middle and end of a string.
emoteRegExp = '\\b' + emote + '\\b';
newEmotesRegExpList.push(emoteRegExp);
}
}
if (bttvLocalEmotes.has('sharedEmotes')) {
jsonArray = bttvLocalEmotes.getJSONArray('sharedEmotes');
for (i = 0; i < jsonArray.length(); i++) {
emote = jsonArray.getJSONObject(i).getString('code');
// Check for emote at the beginning, middle and end of a string.
emoteRegExp = '\\b' + emote + '\\b';
newEmotesRegExpList.push(emoteRegExp);
}
}
defaultSets = ffzEmotes.getJSONArray('default_sets');
for (i = 0; i < defaultSets.length(); i++) {
currentSet = String(defaultSets.getInt(i));
jsonArray = ffzEmotes.getJSONObject('sets').getJSONObject(currentSet).getJSONArray('emoticons');
for (j = 0; j < jsonArray.length(); j++) {
emote = $.replace($.replace($.replace($.replace($.replace(jsonArray.getJSONObject(j).getString('name'), '(', '\\('), ')', '\\)'), '\'', '\\\''), '[', '\\['), ']', '\\]');
// Check for emote at the beginning, middle and end of a string.
emoteRegExp = '\\b' + emote + '\\b';
newEmotesRegExpList.push(emoteRegExp);
}
}
if (ffzLocalEmotes.has('room')) {
currentSet = String(ffzLocalEmotes.getJSONObject('room').getInt('set'));
jsonArray = ffzLocalEmotes.getJSONObject('sets').getJSONObject(currentSet).getJSONArray('emoticons');
for (i = 0; i < jsonArray.length(); i++) {
emote = $.replace($.replace($.replace($.replace($.replace(jsonArray.getJSONObject(j).getString('name'), '(', '\\('), ')', '\\)'), '\'', '\\\''), '[', '\\['), ']', '\\]');
// Check for emote at the beginning, middle and end of a string.
emoteRegExp = '\\b' + emote + '\\b';
newEmotesRegExpList.push(emoteRegExp);
}
}
emotesRegExpList = new RegExp(newEmotesRegExpList.join('|'), 'g');
$.inidb.set('emotecache', 'regexp_cache', newEmotesRegExpList.join(','));
loaded = true;
$.consoleDebug("Built " + newEmotesRegExpList.length + " regular expressions for emote handling.");
newEmotesRegExpList = [];
}
/**
* @function loadEmoteCache
*/
function loadEmoteCache() {
if (!$.inidb.exists('emotecache', 'regexp_cache')) {
return;
}
var regExpList = $.inidb.get('emotecache', 'regexp_cache').split(','),
newEmotesRegExpList = [];
for (var i = 0; i < regExpList.length; i++) {
newEmotesRegExpList.push(regExpList[i]);
}
emotesRegExpList = new RegExp(newEmotesRegExpList.join('|'), 'g');
loaded = true;
$.consoleDebug("Built " + newEmotesRegExpList.length + " regular expressions for emote handling from cache.");
newEmotesRegExpList = [];
}
/**
* @function getEmotesRegExp
* @export $.emotesHandler
* @returns {List}{RegExp}
*/
function getEmotesRegExp() {
return emotesRegExpList;
}
/**
* @function getEmotesMatchCount
* @export $.emotesHandler
* @param {string}
* @returns {number}
*/
function getEmotesMatchCount(message) {
if (!loaded) {
return 0;
}
var matched = message.match(emotesRegExpList);
return (matched !== null ? matched.length : 0);
}
/**
* Export functions to API
*/
$.emotesHandler = {
getEmotesRegExp: getEmotesRegExp,
getEmotesMatchCount: getEmotesMatchCount
};
})();

View File

@@ -0,0 +1,237 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* followHandler.js
*
* Register new followers and unfollows in the channel
* Optionally supports rewarding points for a follow (Only the first time!)
*
* The follow train:
* Checks if the previous follow was less than 5 minutes ago.
* It will trigger on 3, 4, 5, 10 and 20+ followers.
* anymore to reduce spam. Unless the 5 minutes have past, then it will start over.
*
*/
(function () {
var followToggle = $.getSetIniDbBoolean('settings', 'followToggle', false),
followReward = $.getSetIniDbNumber('settings', 'followReward', 0),
followMessage = $.getSetIniDbString('settings', 'followMessage', $.lang.get('followhandler.follow.message')),
followDelay = $.getSetIniDbNumber('settings', 'followDelay', 5),
followQueue = new java.util.concurrent.ConcurrentLinkedQueue,
lastFollow = $.systemTime(),
announceFollows = false;
/*
* @function updateFollowConfig
*/
function updateFollowConfig() {
followReward = $.getIniDbNumber('settings', 'followReward');
followMessage = $.getIniDbString('settings', 'followMessage');
followToggle = $.getIniDbBoolean('settings', 'followToggle');
followDelay = $.getIniDbNumber('settings', 'followDelay');
}
/*
* @function runFollows
*/
function runFollows() {
if (!followQueue.isEmpty() && (lastFollow + (followDelay * 1e3)) < $.systemTime()) {
var s = followQueue.poll();
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (s != '') {
$.say(s);
}
lastFollow = $.systemTime();
}
}
/*
* @event twitchFollowsInitialized
*/
$.bind('twitchFollowsInitialized', function () {
$.consoleLn('>> Enabling follower announcements');
announceFollows = true;
});
/*
* @event twitchFollow
*/
$.bind('twitchFollow', function (event) {
var follower = event.getFollower(),
s = followMessage;
if (announceFollows === true && followToggle === true) {
if (s.match(/\(name\)/)) {
s = $.replace(s, '(name)', $.username.resolve(follower));
}
if (s.match(/\(reward\)/)) {
s = $.replace(s, '(reward)', $.getPointsString(followReward));
}
if (s.match(/^\/w/)) {
s = s.replace('/w', ' /w');
}
followQueue.add(s);
if (followReward > 0) {
$.inidb.incr('points', follower, followReward);
}
$.writeToFile(follower + ' ', './addons/followHandler/latestFollower.txt', false);
$.inidb.set('streamInfo', 'lastFollow', follower);
}
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0];
/*
* @commandpath followreward [amount] - Set the points reward for following
*/
if (command.equalsIgnoreCase('followreward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.set.followreward.usage', $.pointNameMultiple, followReward));
return;
}
followReward = parseInt(action);
$.inidb.set('settings', 'followReward', followReward);
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.set.followreward.success', $.getPointsString(followReward)));
}
/*
* @commandpath followmessage [message] - Set the new follower message when there is a reward
*/
if (command.equalsIgnoreCase('followmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.set.followmessage.usage'));
return;
}
followMessage = args.slice(0).join(' ');
$.inidb.set('settings', 'followMessage', followMessage);
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.set.followmessage.success', followMessage));
}
/*
* @commandpath followdelay [message] - Set the delay in seconds between follow announcements
*/
if (command.equalsIgnoreCase('followdelay')) {
if (isNaN(parseInt(action)) || parseInt(action) < 5) {
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.set.followdelay.usage'));
return;
}
followDelay = parseInt(action);
$.inidb.set('settings', 'followDelay', followDelay);
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.set.followdelay.success', followDelay));
}
/*
* @commandpath followtoggle - Enable or disable the anouncements for new followers
*/
if (command.equalsIgnoreCase('followtoggle')) {
followToggle = !followToggle;
$.setIniDbBoolean('settings', 'followToggle', followToggle);
$.say($.whisperPrefix(sender) + (followToggle ? $.lang.get('followhandler.followtoggle.on') : $.lang.get('followhandler.followtoggle.off')));
}
/*
* @commandpath checkfollow [username] - Check if a user is following the channel
*/
if (command.equalsIgnoreCase('checkfollow')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.check.usage'));
return;
}
action = $.user.sanitize(action);
if ($.user.isFollower(action)) {
$.say($.lang.get('followhandler.check.follows', $.username.resolve(action)));
} else {
$.say($.lang.get('followhandler.check.notfollows', $.username.resolve(action)));
}
}
/*
* @commandpath shoutout [streamer] - Give a shout out to a streamer.
*/
if (command.equalsIgnoreCase('shoutout')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('followhandler.shoutout.usage', command));
return;
}
var streamer = $.user.sanitize(args[0]),
streamerDisplay = $.username.resolve(streamer),
streamerGame = $.getGame(streamer),
streamerURL = 'https://twitch.tv/' + streamer;
if (streamerGame == null || streamerGame.length === 0) {
$.say($.lang.get('followhandler.shoutout.no.game', streamerDisplay, streamerURL));
return;
}
if (!$.isOnline(streamer)) {
$.say($.lang.get('followhandler.shoutout.offline', streamerDisplay, streamerURL, streamerGame));
} else {
$.say($.lang.get('followhandler.shoutout.online', streamerDisplay, streamerURL, streamerGame));
}
}
});
/*
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/followHandler.js', 'followreward', 1);
$.registerChatCommand('./handlers/followHandler.js', 'followtoggle', 1);
$.registerChatCommand('./handlers/followHandler.js', 'followdelay', 1);
$.registerChatCommand('./handlers/followHandler.js', 'followmessage', 1);
$.registerChatCommand('./handlers/followHandler.js', 'checkfollow', 2);
$.registerChatCommand('./handlers/followHandler.js', 'shoutout', 2);
setInterval(runFollows, 2e3, 'scripts::handlers::followHandler.js');
});
$.updateFollowConfig = updateFollowConfig;
})();

View File

@@ -0,0 +1,103 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
(function() {
/*
* @event twitchGameChange
*/
$.bind('twitchGameChange', function(event) {
if (!$.isOnline($.channelName)) {
return;
}
var gamesObj = ($.inidb.exists('pastgames', 'gamesList') ? JSON.parse($.getIniDbString('pastgames', 'gamesList')) : {}),
date = $.logging.getLogDateString().replace(/-/g, '.'),
game = (event.getGameTitle() + '').replace(/\s/g, '-').toLowerCase();
if (gamesObj[game] !== undefined) {
gamesObj[game].push(date);
} else {
gamesObj[game] = [date];
}
$.setIniDbString('pastgames', 'gamesList', JSON.stringify(gamesObj));
});
/*
* @event twitchOnline
*/
$.bind('twitchOnline', function(event) {
var gamesObj = ($.inidb.exists('pastgames', 'gamesList') ? JSON.parse($.getIniDbString('pastgames', 'gamesList')) : {}),
date = $.logging.getLogDateString().replace(/-/g, '.'),
game = ($.getGame($.channelName) + '').replace(/\s/g, '-').toLowerCase();
if (gamesObj[game] !== undefined) {
gamesObj[game].push(date);
} else {
gamesObj[game] = [date];
}
$.setIniDbString('pastgames', 'gamesList', JSON.stringify(gamesObj));
});
/*
* @function gameLookUp
*
* @param {String} gameName
*/
function gameLookUp(gameName) {
var gamesObj = ($.inidb.exists('pastgames', 'gamesList') ? JSON.parse($.getIniDbString('pastgames', 'gamesList')) : {}),
game = (gameName + '').replace(/\s/g, '-').toLowerCase();
if (gamesObj[game] === undefined) {
$.say($.lang.get('gamescanhandler.gamescan.notplayed', $.username.resolve($.channelName), gameName));
} else {
if (gamesObj[game].length > 10) {
$.say($.lang.get('gamescanhandler.gamescan.hasplayeddates', $.username.resolve($.channelName), gameName, gamesObj[game].slice(10).join(', '), (gamesObj[game].length - 10)));
} else {
$.say($.lang.get('gamescanhandler.gamescan.hasplayed', $.username.resolve($.channelName), gameName, gamesObj[game].join(', ')));
}
}
}
$.bind('command', function(event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0];
/**
* @commandpath gamescan [game name] - Scan for a recently played game and list the date in which the broadcaster played it.
*/
if (command.equalsIgnoreCase('gamescan')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('gamescanhandler.gamescan.usage'));
return;
}
gameLookUp(args.join(' '));
}
});
/*
* @event initReady
*/
$.bind('initReady', function() {
$.registerChatCommand('./handlers/gameScanHandler.js', 'gamescan', 7);
});
})();

View File

@@ -0,0 +1,396 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* hostHandler.js
*
* Register and announce (un)host events.
* Optionally supports rewarding points for a host (Only every 6 hours!)
*/
(function () {
var hostReward = $.getSetIniDbNumber('settings', 'hostReward', 0),
autoHostReward = $.getSetIniDbNumber('settings', 'autoHostReward', 0),
hostMinViewerCount = $.getSetIniDbNumber('settings', 'hostMinViewerCount', 0),
hostMinCount = $.getSetIniDbNumber('settings', 'hostMinCount', 0),
hostMessage = $.getSetIniDbString('settings', 'hostMessage', $.lang.get('hosthandler.host.message')),
autoHostMessage = $.getSetIniDbString('settings', 'autoHostMessage', $.lang.get('hosthandler.autohost.message')),
hostHistory = $.getSetIniDbBoolean('settings', 'hostHistory', true),
hostToggle = $.getSetIniDbBoolean('settings', 'hostToggle', false),
autoHostToggle = $.getSetIniDbBoolean('settings', 'autoHostToggle', false),
hostTimeout = 216e5, // 6 hours = 6 * 60 * 60 * 1000
hostList = {},
announceHosts = false;
/*
* @function updateHost
*/
function updateHost() {
hostReward = $.getIniDbNumber('settings', 'hostReward');
autoHostReward = $.getIniDbNumber('settings', 'autoHostReward');
hostMinViewerCont = $.getIniDbNumber('settings', 'hostMinViewerCount');
hostMinCount = $.getIniDbNumber('settings', 'hostMinCount');
hostMessage = $.getIniDbString('settings', 'hostMessage');
autoHostMessage = $.getIniDbString('settings', 'autoHostMessage');
hostHistory = $.getIniDbBoolean('settings', 'hostHistory');
hostToggle = $.getIniDbBoolean('settings', 'hostToggle');
autoHostToggle = $.getIniDbBoolean('settings', 'autoHostToggle');
}
/*
* @event twitchHostsInitialized
*/
$.bind('twitchHostsInitialized', function (event) {
if (!$.bot.isModuleEnabled('./handlers/hostHandler.js')) {
return;
}
$.consoleLn('>> Enabling hosts announcements');
announceHosts = true;
});
/*
* @event twitchAutoHosted
*/
$.bind('twitchAutoHosted', function (event) {
var hoster = event.getHoster().toLowerCase(),
viewers = parseInt(event.getUsers()),
s = autoHostMessage;
if (announceHosts === false) {
return;
}
if (hostList[hoster] !== undefined) {
if (hostList[hoster].hostTime < $.systemTime()) {
hostList[hoster] = {
hostTime: ($.systemTime() + hostTimeout)
};
} else {
return;
}
} else {
hostList[hoster] = {
hostTime: ($.systemTime() + hostTimeout)
};
}
if (s.match(/\(name\)/)) {
s = $.replace(s, '(name)', $.username.resolve(hoster));
}
if (s.match(/\(reward\)/)) {
s = $.replace(s, '(reward)', autoHostReward.toString());
}
if (s.match(/\(viewers\)/)) {
s = $.replace(s, '(viewers)', viewers.toString());
}
if (s.match(/^\/w/)) {
s = s.replace('/w', ' /w');
}
if (autoHostToggle === true && viewers >= hostMinCount) {
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
if (s == '') {
return null;
}
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (s == '') {
return null;
}
}
if (s != '') {
$.say(s);
}
}
$.writeToFile(hoster + ' ', './addons/hostHandler/latestAutoHost.txt', false);
$.writeToFile(hoster + ' ', './addons/hostHandler/latestHostOrAutoHost.txt', false);
if (autoHostReward > 0 && viewers >= hostMinViewerCount) {
$.inidb.incr('points', hoster.toLowerCase(), autoHostReward);
}
});
/*
* @event twitchHosted
*/
$.bind('twitchHosted', function (event) {
var hoster = event.getHoster().toLowerCase(),
viewers = parseInt(event.getUsers()),
s = hostMessage;
// Always update the Host History even if announcements are off or if they recently
// hosted the channel and it would not be noted in chat. This was the caster does
// have a log of all hosts that did occur, announced or not.
//
if ($.getIniDbBoolean('settings', 'hostHistory', false)) {
var now = $.systemTime();
var jsonObject = {
'host': String(hoster),
'time': now,
'viewers': viewers
};
$.inidb.set('hosthistory', hoster + '_' + now, JSON.stringify(jsonObject));
}
if (announceHosts === false) {
return;
}
if (hostList[hoster] !== undefined) {
if (hostList[hoster].hostTime < $.systemTime()) {
hostList[hoster] = {
hostTime: ($.systemTime() + hostTimeout)
};
} else {
return;
}
} else {
hostList[hoster] = {
hostTime: ($.systemTime() + hostTimeout)
};
}
if (s.match(/\(name\)/)) {
s = $.replace(s, '(name)', $.username.resolve(hoster));
}
if (s.match(/\(reward\)/)) {
s = $.replace(s, '(reward)', hostReward.toString());
}
if (s.match(/\(viewers\)/)) {
s = $.replace(s, '(viewers)', viewers.toString());
}
if (s.match(/^\/w/)) {
s = s.replace('/w', ' /w');
}
if (hostToggle === true && viewers >= hostMinCount) {
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
if (s == '') {
return null;
}
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (s == '') {
return null;
}
}
if (s != '') {
$.say(s);
}
}
$.writeToFile(hoster + ' ', './addons/hostHandler/latestHost.txt', false);
$.writeToFile(hoster + ' ', './addons/hostHandler/latestHostOrAutoHost.txt', false);
if (hostReward > 0 && viewers >= hostMinViewerCount) {
$.inidb.incr('points', hoster.toLowerCase(), hostReward);
}
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
argsString = event.getArguments(),
args = event.getArgs(),
action = args[0];
/*
* @commandpath hosttoggle - Toggles host announcements.
*/
if (command.equalsIgnoreCase('hosttoggle')) {
hostToggle = !hostToggle;
$.setIniDbBoolean('settings', 'hostToggle', hostToggle);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.host.toggle', (hostToggle === true ? $.lang.get('common.enabled') : $.lang.get('common.disabled'))));
}
/*
* @commandpath autohosttoggle - Toggles auto host announcements.
*/
if (command.equalsIgnoreCase('autohosttoggle')) {
autoHostToggle = !autoHostToggle;
$.setIniDbBoolean('settings', 'autoHostToggle', autoHostToggle);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.auto.host.toggle', (autoHostToggle === true ? $.lang.get('common.enabled') : $.lang.get('common.disabled'))));
}
/*
* @commandpath hostreward [amount] - Set the amount of points to reward when a channel starts hosting
*/
if (command.equalsIgnoreCase('hostreward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostreward.usage', $.pointNameMultiple));
return;
}
hostReward = parseInt(action);
$.setIniDbNumber('settings', 'hostReward', hostReward);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostreward.success', $.getPointsString(action)));
}
/*
* @commandpath autohostreward [amount] - Set the amount of points to reward when a channel starts autohosting
*/
if (command.equalsIgnoreCase('autohostreward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.autohostreward.usage', $.pointNameMultiple));
return;
}
autoHostReward = parseInt(action);
$.setIniDbNumber('settings', 'autoHostReward', autoHostReward);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.autohostreward.success', $.getPointsString(action)));
}
/*
* @commandpath hostrewardminviewers [amount] - The number of viewers in the hosted channel required to provide a reward.
*/
if (command.equalsIgnoreCase('hostrewardminviewers')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostrewardminviewers.usage'));
return;
}
hostMinViewerCount = parseInt(action);
$.setIniDbNumber('settings', 'hostMinViewerCount', hostMinViewerCount);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostrewardminviewers.success', hostMinViewerCount));
}
/*
* @commandpath hostminviewers [amount] - The number of viewers in the hosted channel required to trigger the chat alert.
*/
if (command.equalsIgnoreCase('hostminviewers')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostminviewers.usage', hostMinCount));
return;
}
hostMinCount = parseInt(action);
$.setIniDbNumber('settings', 'hostMinCount', hostMinCount);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostminviewers.success', hostMinCount));
}
/*
* @commandpath hostmessage [message] - Set a message given when a channel hosts
*/
if (command.equalsIgnoreCase('hostmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostmessage.usage'));
return;
}
hostMessage = argsString;
$.setIniDbString('settings', 'hostMessage', hostMessage);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.hostmessage.success'));
}
/*
* @commandpath autohostmessage [message] - Set a message given when a channel autohosts
*/
if (command.equalsIgnoreCase('autohostmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.autohostmessage.usage'));
return;
}
autoHostMessage = argsString;
$.setIniDbString('settings', 'autoHostMessage', autoHostMessage);
$.say($.whisperPrefix(sender) + $.lang.get('hosthandler.set.autohostmessage.success'));
}
/*
* @commandpath hosthistory [on/off] - Enable or disable collection of host history data for the Panel.
*/
if (command.equalsIgnoreCase('hosthistory')) {
if (args.length < 1) {
$.say($.whisperPrefix(sender) + $.lang.get('hosthistory.usage', $.getIniDbBoolean('settings', 'hostHistory') ? "on" : "off"));
return;
}
if (action.equalsIgnoreCase('on')) {
$.setIniDbBoolean('settings', 'hostHistory', true);
$.say($.whisperPrefix(sender) + $.lang.get('hosthistory.change', $.getIniDbBoolean('settings', 'hostHistory') ? "on" : "off"));
} else if (action.equalsIgnoreCase('off')) {
$.setIniDbBoolean('settings', 'hostHistory', false);
$.say($.whisperPrefix(sender) + $.lang.get('hosthistory.change', $.getIniDbBoolean('settings', 'hostHistory') ? "on" : "off"));
} else {
$.say($.whisperPrefix(sender) + $.lang.get('hosthistory.usage', $.getIniDbBoolean('settings', 'hostHistory') ? "on" : "off"));
}
}
/*
* @commandpath host [channel name] - Will host that channel. Make sure to add your bot as a channel editor on your Twitch dashboard for this to work.
*/
if (command.equalsIgnoreCase('host')) {
if (action !== undefined) {
$.say('.host ' + action);
}
}
/*
* @commandpath unhost - Will unhost the channel that is being hosted. Make sure to add your bot as a channel editor on your Twitch dashboard for this to work.
*/
if (command.equalsIgnoreCase('unhost')) {
$.say('.unhost');
}
});
/*
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/hostHandler.js', 'hostmessage', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'autohostmessage', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'hostreward', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'autohostreward', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'hostrewardminviewers', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'hosthistory', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'hosttoggle', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'autohosttoggle', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'host', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'unhost', 1);
$.registerChatCommand('./handlers/hostHandler.js', 'hostminviewers', 1);
});
$.updateHost = updateHost;
})();

View File

@@ -0,0 +1,232 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
(function() {
var keywords = [];
/*
* @function loadKeywords
*/
function loadKeywords() {
var keys = $.inidb.GetKeyList('keywords', ''),
i;
keywords = [];
for (i = 0; i < keys.length; i++) {
var json = JSON.parse($.inidb.get('keywords', keys[i]));
if (json.isRegex) {
try {
json.regexKey = new RegExp(json.keyword, json.isCaseSensitive ? '' : 'i');
} catch (ex) {
$.log.error('Bad regex detected in keyword [' + keys[i] + ']: ' + ex.message);
continue;
}
}
keywords.push(json);
}
}
/*
* @event ircChannelMessage
*/
$.bind('ircChannelMessage', function(event) {
function executeKeyword(json, event) {
// Make sure the keyword isn't on cooldown.
if ($.coolDownKeywords.get(json.keyword, sender) > 0) {
return;
}
// If the keyword is a command, we need to send that command.
else if (json.response.startsWith('command:')) {
$.command.run(sender, json.response.substring(8), '', event.getTags());
}
// Keyword just has a normal response.
else {
json.response = $.replace(json.response, '(keywordcount)', '(keywordcount ' + json.keyword + ')');
$.say($.tags(event, json.response, false));
}
}
var message = event.getMessage(),
sender = event.getSender(),
messagePartsLower = message.toLowerCase().split(' '),
messageParts = message.split(' '),
json;
// Don't say the keyword if someone tries to remove it.
if (message.startsWith('!keyword')) {
return;
}
for (var i = 0; i < keywords.length; i++) {
json = keywords[i];
if (json.isRegex) {
if (json.regexKey.test(message)) {
executeKeyword(json, event);
break;
}
} else {
var str = '',
caseAdjustedMessageParts = messageParts;
if (!json.isCaseSensitive) {
json.keyword = json.keyword.toLowerCase();
caseAdjustedMessageParts = messagePartsLower;
}
for (var idx = 0; idx < caseAdjustedMessageParts.length; idx++) {
// Create a string to match on the keyword.
str += (caseAdjustedMessageParts[idx] + ' ');
// Either match on the exact word or phrase if it contains it.
if ((json.keyword.includes(' ') && str.includes(json.keyword)) || (caseAdjustedMessageParts[idx] + '') === (json.keyword + '')) {
executeKeyword(json, event);
break;
}
}
}
}
});
/*
* @event command
*/
$.bind('command', function(event) {
var sender = event.getSender(),
command = event.getCommand(),
argString = event.getArguments().trim(),
args = event.getArgs(),
action = args[0],
subAction = args[1],
actionArgs = args[2];
/*
* @commandpath keyword - Base command for keyword options
*/
if (command.equalsIgnoreCase('keyword')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.keyword.usage'));
return;
}
/*
* @commandpath keyword add [keyword] [response] - Adds a keyword and a response, use regex: at the start of the response to use regex.
*/
if (action.equalsIgnoreCase('add')) {
var isRegex = false,
isCaseSensitive = false,
keyword = null,
response = null;
for (var i = 1; i < args.length; i++) {
if (keyword == null) {
if (args[i].equalsIgnoreCase('--regex')) {
isRegex = true;
} else if (args[i].equalsIgnoreCase('--case-sensitive')) {
isCaseSensitive = true;
} else {
keyword = args[i] + '';
}
} else {
response = args.splice(i).join(' ');
break;
}
}
if (response == null) {
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.add.usage'));
return;
}
var json = JSON.stringify({
keyword: keyword,
response: response,
isRegex: isRegex,
isCaseSensitive: isCaseSensitive
});
$.setIniDbString('keywords', keyword, json);
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.keyword.added', keyword));
loadKeywords();
}
/*
* @commandpath keyword remove [keyword] - Removes a given keyword
*/
if (action.equalsIgnoreCase('remove')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.remove.usage'));
return;
} else if (!$.inidb.exists('keywords', subAction.toLowerCase())) {
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.keyword.404'));
return;
}
subAction = args[1].toLowerCase();
$.inidb.del('keywords', subAction);
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.keyword.removed', subAction));
loadKeywords();
}
/*
* @commandpath keyword cooldown [keyword] [seconds] - Sets a cooldown on the keyword. Use -1 to remove it. If you use the command: tag and you have a cooldown on that command it will use that cooldown
*/
if (action.equalsIgnoreCase('cooldown')) {
if (subAction === undefined || isNaN(parseInt(args[2]))) {
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.cooldown.usage'));
return;
} else if (!$.inidb.exists('keywords', subAction.toLowerCase())) {
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.keyword.404'));
return;
}
if (args[2] === -1) {
$.inidb.del('coolkey', subAction.toLowerCase());
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.cooldown.removed', subAction));
$.coolDownKeywords.clear(subAction.toLowerCase());
return;
}
$.inidb.set('coolkey', subAction.toLowerCase(), parseInt(args[2]));
$.say($.whisperPrefix(sender) + $.lang.get('keywordhandler.cooldown.set', subAction, args[2]));
$.coolDownKeywords.clear(subAction.toLowerCase());
}
}
});
/*
* @event initReady
*/
$.bind('initReady', function() {
$.registerChatCommand('./handlers/keywordHandler.js', 'keyword', 1);
$.registerChatSubcommand('keyword', 'add', 1);
$.registerChatSubcommand('keyword', 'remove', 1);
$.registerChatSubcommand('keyword', 'cooldown', 1);
loadKeywords();
});
/*
* @event webPanelSocketUpdate
*/
$.bind('webPanelSocketUpdate', function(event) {
if (event.getScript().equalsIgnoreCase('./handlers/keywordHandler.js')) {
loadKeywords();
}
});
})();

View File

@@ -0,0 +1,371 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
(function () {
var raidToggle = $.getSetIniDbBoolean('raidSettings', 'raidToggle', false),
newRaidIncMessage = $.getSetIniDbString('raidSettings', 'newRaidIncMessage', '(username) is raiding us with (viewers) viewers!'),
raidIncMessage = $.getSetIniDbString('raidSettings', 'raidIncMessage', '(username) is raiding us with (viewers) viewers! This is the (times) time (username) has raided us!'),
raidReward = $.getSetIniDbNumber('raidSettings', 'raidReward', 0),
raidOutMessage = $.getSetIniDbString('raidSettings', 'raidOutMessage', 'We are going to raid (username)! Go to their channel (url) now!'),
raidOutSpam = $.getSetIniDbNumber('raidSettings', 'raidOutSpam', 1);
/*
* @function Reloads the raid variables from the panel.
*/
function reloadRaid() {
raidToggle = $.getIniDbBoolean('raidSettings', 'raidToggle');
newRaidIncMessage = $.getIniDbString('raidSettings', 'newRaidIncMessage');
raidIncMessage = $.getIniDbString('raidSettings', 'raidIncMessage');
raidReward = $.getIniDbNumber('raidSettings', 'raidReward');
raidOutMessage = $.getIniDbString('raidSettings', 'raidOutMessage');
raidOutSpam = $.getIniDbNumber('raidSettings', 'raidOutSpam');
}
/*
* @function Saves the current raid from the user or adds it to the list if they raided in the past.
*
* @param {String} username
* @param {String} viewers
*/
function saveRaidFromUsername(username, viewers) {
var raidObj = JSON.parse($.getIniDbString('incoming_raids', username, '{}'));
if (raidObj.hasOwnProperty('totalRaids')) {
// Increase total raids.
raidObj.totalRaids = parseInt(raidObj.totalRaids) + 1;
// Increase total viewers which the user has raided for in total (all time).
raidObj.totalViewers = (parseInt(raidObj.totalViewers) + parseInt(viewers));
// Update last raid time.
raidObj.lastRaidTime = $.systemTime();
// Last raid viewers.
raidObj.lastRaidViewers = viewers;
// Push this raid to the raids array.
//raidObj.raids.push({
// time: $.systemTime(),
// viewers: viewers,
// username: username
//});
} else {
// Increase total raids.
raidObj.totalRaids = '1';
// Increase total viewers.
raidObj.totalViewers = viewers;
// Update last raid time.
raidObj.lastRaidTime = $.systemTime();
// Last raid viewers.
raidObj.lastRaidViewers = viewers;
// Create new raid array.
//raidObj.raids = [];
// Push this raid to the raids array.
//raidObj.raids.push({
// time: $.systemTime(),
// viewers: viewers,
// username: username
//});
}
// Save the new object.
$.setIniDbString('incoming_raids', username, JSON.stringify(raidObj));
}
/*
* @function Saves the outgoing raid for the user or adds it to the list.
*
* @param {String} username
* @param {String} viewers
*/
function saveOutRaidForUsername(username, viewers) {
var raidObj = JSON.parse($.getIniDbString('outgoing_raids', username, '{}'));
if (raidObj.hasOwnProperty('totalRaids')) {
// Increase total raids.
raidObj.totalRaids = parseInt(raidObj.totalRaids) + 1;
// Increase total viewers which the channel has raided the other channel for (all time).
raidObj.totalViewers = (parseInt(raidObj.totalViewers) + parseInt(viewers));
// Update last raid time.
raidObj.lastRaidTime = $.systemTime();
// Last raid viewers.
raidObj.lastRaidViewers = viewers;
} else {
// Increase total raids.
raidObj.totalRaids = '1';
// Increase total viewers.
raidObj.totalViewers = viewers;
// Update last raid time.
raidObj.lastRaidTime = $.systemTime();
// Last raid viewers.
raidObj.lastRaidViewers = viewers;
}
// Save the new object.
$.setIniDbString('outgoing_raids', username, JSON.stringify(raidObj));
}
/*
* @function Handles sending the messages in chat for outgoing raids.
*
* @param {String} username
*/
function handleOutRaid(username) {
var message = raidOutMessage;
// Replace tags.
if (message.match(/\(username\)/)) {
message = $.replace(message, '(username)', $.username.resolve(username));
}
if (message.match(/\(url\)/)) {
message = $.replace(message, '(url)', 'https://twitch.tv/' + username);
}
// Spam the message, if needed.
for (var i = 0; i < raidOutSpam; i++) {
$.say(message);
}
// Use the .raid command.
$.say('.raid ' + username);
// Increase out going raids.
saveOutRaidForUsername(username + '', $.getViewers($.channelName) + '');
}
/*
* @event twitchRaid
*/
$.bind('twitchRaid', function (event) {
var username = event.getUsername(),
viewers = event.getViewers(),
hasRaided = false,
raidObj,
message;
if (raidToggle === true) {
// If the user has raided before.
if ((hasRaided = $.inidb.exists('incoming_raids', username))) {
// Set the message.
message = raidIncMessage;
// Get the raid object.
raidObj = JSON.parse($.getIniDbString('incoming_raids', username));
} else {
message = newRaidIncMessage;
}
// Replace tags.
if (message.match(/\(username\)/)) {
message = $.replace(message, '(username)', username);
}
if (message.match(/\(viewers\)/)) {
message = $.replace(message, '(viewers)', viewers);
}
if (message.match(/\(url\)/)) {
message = $.replace(message, '(url)', 'https://twitch.tv/' + username);
}
if (message.match(/\(reward\)/)) {
message = $.replace(message, '(reward)', raidReward);
}
if (message.match(/\(game\)/)) {
message = $.replace(message, '(game)', $.getGame(username));
}
if (hasRaided && message.match(/\(times\)/)) {
message = $.replace(message, '(times)', raidObj.totalRaids);
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
if (message == '') {
return null;
}
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (message == '') {
return null;
}
}
$.say(message);
}
// Add reward.
if (raidReward > 0) {
$.inidb.incr('points', username, raidReward);
}
// Save the raid to the database.
saveRaidFromUsername(username + '', viewers + '');
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0],
subAction = args[1];
if (command.equalsIgnoreCase('raid')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.usage'));
return;
}
/*
* @commandpath raid toggle - Toggles if the bot should welcome raiders.
*/
if (action.equalsIgnoreCase('toggle')) {
raidToggle = !raidToggle;
$.setIniDbBoolean('raidSettings', 'raidToggle', raidToggle);
$.say($.whisperPrefix(sender) + (raidToggle ? $.lang.get('raidhandler.toggle.enabled') : $.lang.get('raidhandler.toggle.disabled')));
return;
}
/*
* @commandpath raid setreward [amount] - Sets the amount of points given to raiders.
*/
if (action.equalsIgnoreCase('setreward')) {
if (isNaN(subAction)) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.reward.usage'));
return;
}
raidReward = parseInt(subAction);
$.setIniDbNumber('raidSettings', 'raidReward', raidReward);
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.reward.set', $.getPointsString(raidReward)));
return;
}
/*
* @commandpath raid setincomingmessage [message] - Sets the incoming raid message - Tags: (username), (viewers), (url), (times), (reward) and (game)
*/
if (action.equalsIgnoreCase('setincomingmessage')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.inc.message.usage'));
return;
}
raidIncMessage = args.slice(1).join(' ');
$.setIniDbString('raidSettings', 'raidIncMessage', raidIncMessage);
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.inc.message.set'));
return;
}
/*
* @commandpath raid setnewincomingmessage [message] - Sets the incoming raid message for first time raiders - Tags: (username), (viewers), (url), (reward) and (game)
*/
if (action.equalsIgnoreCase('setnewincomingmessage')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.new.inc.message.usage'));
return;
}
newRaidIncMessage = args.slice(1).join(' ');
$.setIniDbString('raidSettings', 'newRaidIncMessage', newRaidIncMessage);
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.new.inc.message.set'));
return;
}
/*
* @commandpath raid setoutgoingmessage [message] - Sets the outgoing message for when you raid someone - Tags (username) and (url)
*/
if (action.equalsIgnoreCase('setoutgoingmessage')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.out.message.usage'));
return;
}
raidOutMessage = args.slice(1).join(' ');
$.setIniDbString('raidSettings', 'raidOutMessage', raidOutMessage);
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.out.message.set'));
return;
}
/*
* @commandpath raid setoutgoingmessagespam [amount] - Sets the amount of times that the outgoing raid message is sent in chat. Maximum is 10 times.
*/
if (action.equalsIgnoreCase('setoutgoingmessagespam')) {
if (isNaN(subAction) || parseInt(subAction) > 10 || parseInt(subAction) < 1) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.spam.amount.usage'));
return;
}
raidOutSpam = parseInt(subAction);
$.setIniDbNumber('raidSettings', 'raidOutSpam', raidOutSpam);
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.spam.amount.set'));
return;
}
/*
* @commandpath raid lookup [username] - Shows the amount of times the username has raided the channel.
*/
if (action.equalsIgnoreCase('lookup')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.lookup.usage'));
return;
}
if ($.inidb.exists('incoming_raids', subAction.toLowerCase())) {
var raidObj = JSON.parse($.inidb.get('incoming_raids', subAction.toLowerCase())),
displayName = $.username.resolve(subAction);
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.lookup.user', displayName, raidObj.totalRaids, new Date(raidObj.lastRaidTime).toLocaleString(), raidObj.lastRaidViewers));
} else {
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.lookup.user.404', displayName));
}
return;
}
// Make sure the user exists on Twitch.
if ($.username.exists(action)) {
handleOutRaid(action);
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('raidhandler.usage'));
}
});
/*
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/raidHandler.js', 'raid', 1);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'toggle', 1);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'setreward', 1);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'lookup', 2);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'setincomingmessage', 1);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'setnewincomingmessage', 1);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'setoutgoingmessage', 1);
$.registerChatSubcommand('./handlers/raidHandler.js', 'raid', 'setoutgoingmessagespam', 1);
});
/* Export to API */
$.reloadRaid = reloadRaid;
})();

View File

@@ -0,0 +1,247 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* streamElementsHandler.js
*
* Gets donation from the StreamElements API and posts them in Twitch chat.
*/
(function() {
var message = $.getSetIniDbString('streamElementsHandler', 'message', $.lang.get('streamElements.donation.new')),
toggle = $.getSetIniDbBoolean('streamElementsHandler', 'toggle', false),
reward = $.getSetIniDbFloat('streamElementsHandler', 'reward', 0),
group = $.getSetIniDbBoolean('streamElementsHandler', 'group', false),
groupMin = $.getSetIniDbNumber('streamElementsHandler', 'groupMin', 5),
dir = './addons/streamElements',
announce = false;
/*
* @function reloadStreamElements
*/
function reloadStreamElements() {
message = $.getIniDbString('streamElementsHandler', 'message');
toggle = $.getIniDbBoolean('streamElementsHandler', 'toggle');
reward = $.getIniDbFloat('streamElementsHandler', 'reward');
group = $.getIniDbBoolean('streamElementsHandler', 'group');
groupMin = $.getIniDbNumber('streamElementsHandler', 'groupMin');
}
/*
* @event streamElementsDonationInitialized
*/
$.bind('streamElementsDonationInitialized', function(event) {
if (!$.isDirectory(dir)) {
$.consoleDebug('>> Creating the StreamElements Handler Directory: ' + dir);
$.mkDir(dir);
}
$.consoleLn('>> Enabling StreamElements donation announcements');
$.log.event('StreamElements donation announcements enabled');
announce = true;
});
/*
* @event streamElementsDonation
*/
$.bind('streamElementsDonation', function(event) {
var jsonString = event.getJsonString(),
JSONObject = Packages.org.json.JSONObject,
donationObj = new JSONObject(jsonString),
donationID = donationObj.getString('_id'),
paramObj = donationObj.getJSONObject('donation'),
donationUsername = paramObj.getJSONObject('user').getString('username'),
donationCurrency = paramObj.getString('currency'),
donationMessage = (paramObj.has('message') ? paramObj.getString('message') : ''),
donationAmount = paramObj.getInt('amount'),
s = message;
if ($.inidb.exists('donations', donationID)) {
return;
}
$.inidb.set('streamInfo', 'lastDonator', donationUsername);
$.inidb.set('donations', donationID, donationObj);
$.inidb.set('donations', 'last_donation', donationID);
$.inidb.set('donations', 'last_donation_message', $.lang.get('main.donation.last.tip.message', donationUsername, donationCurrency, donationAmount));
$.writeToFile(donationUsername + ": " + donationAmount + " ", dir + '/latestDonation.txt', false);
if (toggle === true && announce === true) {
if (s.match(/\(name\)/)) {
s = $.replace(s, '(name)', donationUsername);
}
if (s.match(/\(currency\)/)) {
s = $.replace(s, '(currency)', donationCurrency);
}
if (s.match(/\(amount\)/)) {
s = $.replace(s, '(amount)', String(parseInt(donationAmount.toFixed(2))));
}
if (s.match(/\(amount\.toFixed\(0\)\)/)) {
s = $.replace(s, '(amount.toFixed(0))', String(parseInt(donationAmount.toFixed(0))));
}
if (s.match(/\(message\)/)) {
s = $.replace(s, '(message)', donationMessage);
}
if (s.match(/\(reward\)/)) {
s = $.replace(s, '(reward)', $.getPointsString(Math.floor(parseFloat(donationAmount) * reward)));
}
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
if (s == '') {
return null;
}
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (s == '') {
return null;
}
}
$.say(s);
}
if (reward > 0) {
$.inidb.incr('points', donationUsername.toLowerCase(), Math.floor(parseFloat(donationAmount) * reward));
}
if (group === true) {
donationUsername = donationUsername.toLowerCase();
$.inidb.incr('donations', donationUsername, donationAmount);
if ($.inidb.exists('donations', donationUsername) && $.inidb.get('donations', donationUsername) >= groupMin) {
if ($.getUserGroupId(donationUsername) > 3) {
$.setUserGroupById(donationUsername, '4');
}
}
}
});
/*
* @event command
*/
$.bind('command', function(event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0],
subAction = args[1];
/*
* @commandpath streamelements - Controls various options for donation handling
*/
if (command.equalsIgnoreCase('streamelements')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donations.usage'));
return;
}
/*
* @commandpath streamelements toggledonators - Toggles the Donator's group.
*/
if (action.equalsIgnoreCase('toggledonators')) {
group = !group;
$.setIniDbBoolean('streamElementsHandler', 'group', group);
$.say($.whisperPrefix(sender) + (group ? $.lang.get('streamelements.enabled.donators') : $.lang.get('streamelements.disabled.donators')));
}
/*
* @commandpath streamelements minmumbeforepromotion - Set the minimum before people get promoted to a Donator
*/
if (action.equalsIgnoreCase('minmumbeforepromotion')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donators.min.usage'));
return;
}
groupMin = subAction;
$.setIniDbNumber('streamElementsHandler', 'groupMin', groupMin);
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donators.min', groupMin));
}
/*
* @commandpath streamelements announce - Toggles announcements for donations off and on
*/
if (action.equalsIgnoreCase('announce')) {
toggle = !toggle;
$.setIniDbBoolean('streamElementsHandler', 'toggle', toggle);
$.say($.whisperPrefix(sender) + (toggle ? $.lang.get('streamelements.donations.announce.enable') : $.lang.get('streamelements.donations.announce.disable')));
}
/*
* @commandpath streamelements rewardmultiplier [n.n] - Set a reward multiplier for donations.
*/
if (action.equalsIgnoreCase('rewardmultiplier')) {
if (isNaN(parseFloat(subAction))) {
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donations.reward.usage'));
return;
}
reward = parseFloat(subAction);
$.setIniDbFloat('streamElementsHandler', 'reward', reward);
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donations.reward.success', subAction, (subAction == "1" ? $.pointNameSingle : $.pointNameMultiple).toLowerCase()));
}
/*
* @commandpath streamelements message [message text] - Set the donation message. Tags: (name), (amount), (reward), (message) and (currency)
*/
if (action.equalsIgnoreCase('message')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donations.message.usage'));
return;
}
var msg = args.splice(1).join(' ');
if (msg.search(/\(name\)/) == -1) {
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donations.message.no-name'));
return;
}
$.setIniDbString('streamElementsHandler', 'message', msg);
message = $.getIniDbString('streamElementsHandler', 'message');
$.say($.whisperPrefix(sender) + $.lang.get('streamelements.donations.message.success', msg));
}
}
});
/**
* @event initReady
*/
$.bind('initReady', function() {
$.registerChatCommand('./handlers/streamElementsHandler.js', 'streamelements', 1);
});
$.reloadStreamElements = reloadStreamElements;
})();

View File

@@ -0,0 +1,789 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* subscribehandler.js
*
* Register new subscribers and unsubscribers in the channel
*/
(function () {
var subMessage = $.getSetIniDbString('subscribeHandler', 'subscribeMessage', '(name) just subscribed!'),
primeSubMessage = $.getSetIniDbString('subscribeHandler', 'primeSubscribeMessage', '(name) just subscribed with Twitch Prime!'),
reSubMessage = $.getSetIniDbString('subscribeHandler', 'reSubscribeMessage', '(name) just subscribed for (months) months in a row!'),
giftSubMessage = $.getSetIniDbString('subscribeHandler', 'giftSubMessage', '(name) just gifted (recipient) a subscription!'),
giftAnonSubMessage = $.getSetIniDbString('subscribeHandler', 'giftAnonSubMessage', 'An anonymous viewer gifted (recipient) a subscription!'),
massGiftSubMessage = $.getSetIniDbString('subscribeHandler', 'massGiftSubMessage', '(name) just gifted (amount) subscriptions to random users in the channel!'),
massAnonGiftSubMessage = $.getSetIniDbString('subscribeHandler', 'massAnonGiftSubMessage', 'An anonymous viewer gifted (amount) subscriptions to random viewers!'),
subWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'subscriberWelcomeToggle', true),
primeSubWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'primeSubscriberWelcomeToggle', true),
reSubWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'reSubscriberWelcomeToggle', true),
giftSubWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'giftSubWelcomeToggle', true),
giftAnonSubWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'giftAnonSubWelcomeToggle', true),
massGiftSubWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'massGiftSubWelcomeToggle', true),
massAnonGiftSubWelcomeToggle = $.getSetIniDbBoolean('subscribeHandler', 'massAnonGiftSubWelcomeToggle', true),
subReward = $.getSetIniDbNumber('subscribeHandler', 'subscribeReward', 0),
reSubReward = $.getSetIniDbNumber('subscribeHandler', 'reSubscribeReward', 0),
giftSubReward = $.getSetIniDbNumber('subscribeHandler', 'giftSubReward', 0),
massGiftSubReward = $.getSetIniDbNumber('subscribeHandler', 'massGiftSubReward', 0),
customEmote = $.getSetIniDbString('subscribeHandler', 'resubEmote', ''),
subPlan1000 = $.getSetIniDbString('subscribeHandler', 'subPlan1000', 'Tier 1'),
subPlan2000 = $.getSetIniDbString('subscribeHandler', 'subPlan2000', 'Tier 2'),
subPlan3000 = $.getSetIniDbString('subscribeHandler', 'subPlan3000', 'Tier 3'),
announce = false,
emotes = [],
i;
/*
* @function updateSubscribeConfig
*/
function updateSubscribeConfig() {
subMessage = $.getIniDbString('subscribeHandler', 'subscribeMessage');
primeSubMessage = $.getIniDbString('subscribeHandler', 'primeSubscribeMessage');
reSubMessage = $.getIniDbString('subscribeHandler', 'reSubscribeMessage');
giftSubMessage = $.getIniDbString('subscribeHandler', 'giftSubMessage');
giftAnonSubMessage = $.getIniDbString('subscribeHandler', 'giftAnonSubMessage');
massGiftSubMessage = $.getIniDbString('subscribeHandler', 'massGiftSubMessage');
massAnonGiftSubMessage = $.getIniDbString('subscribeHandler', 'massAnonGiftSubMessage');
subWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'subscriberWelcomeToggle');
primeSubWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'primeSubscriberWelcomeToggle');
reSubWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'reSubscriberWelcomeToggle');
giftSubWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'giftSubWelcomeToggle');
giftAnonSubWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'giftAnonSubWelcomeToggle');
massGiftSubWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'massGiftSubWelcomeToggle');
massAnonGiftSubWelcomeToggle = $.getIniDbBoolean('subscribeHandler', 'massAnonGiftSubWelcomeToggle');
subReward = $.getIniDbNumber('subscribeHandler', 'subscribeReward');
reSubReward = $.getIniDbNumber('subscribeHandler', 'reSubscribeReward');
giftSubReward = $.getIniDbNumber('subscribeHandler', 'giftSubReward');
massGiftSubReward = $.getIniDbNumber('subscribeHandler', 'massGiftSubReward');
customEmote = $.getIniDbString('subscribeHandler', 'resubEmote');
subPlan1000 = $.getIniDbString('subscribeHandler', 'Tier 1');
subPlan2000 = $.getIniDbString('subscribeHandler', 'Tier 2');
subPlan3000 = $.getIniDbString('subscribeHandler', 'Tier 3');
}
/*
* @function getPlanName
*/
function getPlanName(plan) {
if (plan.equals('1000')) {
return subPlan1000;
} else if (plan.equals('2000')) {
return subPlan2000;
} else if (plan.equals('3000')) {
return subPlan3000;
} else if (plan.equals('Prime')) {
return 'Prime';
}
return 'Unknown Tier';
}
/*
* @event twitchSubscriber
*/
$.bind('twitchSubscriber', function (event) {
var subscriber = event.getSubscriber(),
tier = event.getPlan(),
message = subMessage;
if (subWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', subscriber);
}
if (message.match(/\(reward\)/g)) {
message = $.replace(message, '(reward)', String(subReward));
}
if (message.match(/\(plan\)/g)) {
message = $.replace(message, '(plan)', getPlanName(tier));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
$.addSubUsersList(subscriber);
$.restoreSubscriberStatus(subscriber);
$.writeToFile(subscriber + ' ', './addons/subscribeHandler/latestSub.txt', false);
$.inidb.set('streamInfo', 'lastSub', subscriber);
if (subReward > 0) {
$.inidb.incr('points', subscriber, subReward);
}
}
});
/*
* @event twitchPrimeSubscriber
*/
$.bind('twitchPrimeSubscriber', function (event) {
var subscriber = event.getSubscriber(),
message = primeSubMessage;
if (primeSubWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', subscriber);
}
if (message.match(/\(reward\)/g)) {
message = $.replace(message, '(reward)', String(subReward));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
$.addSubUsersList(subscriber);
$.restoreSubscriberStatus(subscriber);
$.writeToFile(subscriber + ' ', './addons/subscribeHandler/latestSub.txt', false);
$.inidb.set('streamInfo', 'lastSub', subscriber);
if (subReward > 0) {
$.inidb.incr('points', subscriber, subReward);
}
}
});
/*
* @event twitchReSubscriber
*/
$.bind('twitchReSubscriber', function (event) {
var resubscriber = event.getReSubscriber(),
months = event.getMonths(),
tier = event.getPlan(),
message = reSubMessage,
emotes = [];
if (reSubWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', resubscriber);
}
if (message.match(/\(months\)/g)) {
message = $.replace(message, '(months)', months);
}
if (message.match(/\(reward\)/g)) {
message = $.replace(message, '(reward)', String(reSubReward));
}
if (message.match(/\(plan\)/g)) {
message = $.replace(message, '(plan)', getPlanName(tier));
}
if (message.match(/\(customemote\)/)) {
for (i = 0; i < months; i++, emotes.push(customEmote))
;
message = $.replace(message, '(customemote)', emotes.join(' '));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
$.addSubUsersList(resubscriber);
$.restoreSubscriberStatus(resubscriber);
$.writeToFile(resubscriber + ' ', './addons/subscribeHandler/latestResub.txt', false);
$.writeToFile(resubscriber + ': ' + months + ' ', './addons/subscribeHandler/latestResub&Months.txt', false);
$.inidb.set('streamInfo', 'lastReSub', resubscriber);
if (reSubReward > 0) {
$.inidb.incr('points', resubscriber, reSubReward);
}
}
});
/*
* @event twitchSubscriptionGift
*/
$.bind('twitchSubscriptionGift', function (event) {
var gifter = event.getUsername(),
recipient = event.getRecipient(),
months = event.getMonths(),
tier = event.getPlan(),
message = giftSubMessage;
if (giftSubWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', gifter);
}
if (message.match(/\(recipient\)/g)) {
message = $.replace(message, '(recipient)', recipient);
}
if (message.match(/\(months\)/g)) {
message = $.replace(message, '(months)', months);
}
if (message.match(/\(reward\)/g)) {
message = $.replace(message, '(reward)', String(subReward));
}
if (message.match(/\(plan\)/g)) {
message = $.replace(message, '(plan)', getPlanName(tier));
}
if (message.match(/\(customemote\)/)) {
for (i = 0; i < months; i++, emotes.push(customEmote))
;
message = $.replace(message, '(customemote)', emotes.join(' '));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
$.addSubUsersList(recipient);
$.restoreSubscriberStatus(recipient);
$.writeToFile(recipient + ' ', './addons/subscribeHandler/latestSub.txt', false);
$.inidb.set('streamInfo', 'lastSub', recipient);
if (subReward > 0) {
$.inidb.incr('points', recipient, subReward);
}
if (giftSubReward > 0) {
$.inidb.incr('points', gifter, giftSubReward);
}
}
});
/*
* @event twitchSubscriptionGift
*/
$.bind('twitchMassSubscriptionGifted', function (event) {
var gifter = event.getUsername(),
amount = event.getAmount(),
tier = event.getPlan(),
message = massGiftSubMessage;
if (massGiftSubWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', gifter);
}
if (message.match(/\(amount\)/g)) {
message = $.replace(message, '(amount)', amount);
}
if (message.match(/\(reward\)/g)) {
message = $.replace(message, '(reward)', String(massGiftSubReward * parseInt(amount)));
}
if (message.match(/\(plan\)/g)) {
message = $.replace(message, '(plan)', getPlanName(tier));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
if (massGiftSubReward > 0) {
$.inidb.incr('points', gifter, massGiftSubReward * parseInt(amount));
}
}
});
/*
* @event twitchAnonymousSubscriptionGift
*/
$.bind('twitchAnonymousSubscriptionGift', function (event) {
var gifter = event.getUsername(),
recipient = event.getRecipient(),
months = event.getMonths(),
tier = event.getPlan(),
message = giftAnonSubMessage;
if (giftAnonSubWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', gifter);
}
if (message.match(/\(recipient\)/g)) {
message = $.replace(message, '(recipient)', recipient);
}
if (message.match(/\(months\)/g)) {
message = $.replace(message, '(months)', months);
}
if (message.match(/\(reward\)/g)) {
message = $.replace(message, '(reward)', String(subReward));
}
if (message.match(/\(plan\)/g)) {
message = $.replace(message, '(plan)', getPlanName(tier));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
$.addSubUsersList(recipient);
$.restoreSubscriberStatus(recipient);
$.writeToFile(recipient + ' ', './addons/subscribeHandler/latestSub.txt', false);
$.inidb.set('streamInfo', 'lastSub', recipient);
if (subReward > 0) {
$.inidb.incr('points', recipient, subReward);
}
}
});
/*
* @event twitchMassAnonymousSubscriptionGifted
*/
$.bind('twitchMassAnonymousSubscriptionGifted', function (event) {
var gifter = event.getUsername(),
amount = event.getAmount(),
tier = event.getPlan(),
message = massAnonGiftSubMessage;
if (massAnonGiftSubWelcomeToggle === true && announce === true) {
if (message.match(/\(name\)/g)) {
message = $.replace(message, '(name)', gifter);
}
if (message.match(/\(amount\)/g)) {
message = $.replace(message, '(amount)', amount);
}
if (message.match(/\(plan\)/g)) {
message = $.replace(message, '(plan)', getPlanName(tier));
}
if (message.match(/\(alert [,.\w\W]+\)/g)) {
var filename = message.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
message = (message + '').replace(/\(alert [,.\w\W]+\)/, '');
}
if (message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
message = $.replace(message, message.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
}
if (message != '') {
$.say(message);
}
}
});
/*
* @event command
*/
$.bind('command', function (event) {
var sender = event.getSender(),
command = event.getCommand(),
argsString = event.getArguments(),
args = event.getArgs(),
action = args[0],
planId;
/*
* @commandpath subwelcometoggle - Enable or disable subscription alerts.
*/
if (command.equalsIgnoreCase('subwelcometoggle')) {
subWelcomeToggle = !subWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'subscriberWelcomeToggle', subWelcomeToggle);
$.say($.whisperPrefix(sender) + (subWelcomeToggle ? $.lang.get('subscribehandler.new.sub.toggle.on') : $.lang.get('subscribehandler.new.sub.toggle.off')));
}
/*
* @commandpath primesubwelcometoggle - Enable or disable Twitch Prime subscription alerts.
*/
if (command.equalsIgnoreCase('primesubwelcometoggle')) {
primeSubWelcomeToggle = !primeSubWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'primeSubscriberWelcomeToggle', primeSubWelcomeToggle);
$.say($.whisperPrefix(sender) + (primeSubWelcomeToggle ? $.lang.get('subscribehandler.new.primesub.toggle.on') : $.lang.get('subscribehandler.new.primesub.toggle.off')));
}
/*
* @commandpath resubwelcometoggle - Enable or disable resubsciption alerts.
*/
if (command.equalsIgnoreCase('resubwelcometoggle')) {
reSubWelcomeToggle = !reSubWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'reSubscriberWelcomeToggle', reSubWelcomeToggle);
$.say($.whisperPrefix(sender) + (reSubWelcomeToggle ? $.lang.get('subscribehandler.resub.toggle.on') : $.lang.get('subscribehandler.resub.toggle.off')))
}
/*
* @commandpath giftsubwelcometoggle - Enable or disable subgifting alerts.
*/
if (command.equalsIgnoreCase('giftsubwelcometoggle')) {
giftSubWelcomeToggle = !giftSubWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'giftSubWelcomeToggle', giftSubWelcomeToggle);
$.say($.whisperPrefix(sender) + (giftSubWelcomeToggle ? $.lang.get('subscribehandler.giftsub.toggle.on') : $.lang.get('subscribehandler.giftsub.toggle.off')))
}
/*
* @commandpath giftanonsubwelcometoggle - Enable or disable anonymous subgifting alerts.
*/
if (command.equalsIgnoreCase('giftanonsubwelcometoggle')) {
giftAnonSubWelcomeToggle = !giftAnonSubWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'giftAnonSubWelcomeToggle', giftAnonSubWelcomeToggle);
$.say($.whisperPrefix(sender) + (giftAnonSubWelcomeToggle ? $.lang.get('subscribehandler.anongiftsub.toggle.on') : $.lang.get('subscribehandler.anongiftsub.toggle.off')))
}
/*
* @commandpath massgiftsubwelcometoggle - Enable or disable subgifting alerts.
*/
if (command.equalsIgnoreCase('massgiftsubwelcometoggle')) {
massGiftSubWelcomeToggle = !massGiftSubWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'massGiftSubWelcomeToggle', massGiftSubWelcomeToggle);
$.say($.whisperPrefix(sender) + (massGiftSubWelcomeToggle ? $.lang.get('subscribehandler.massgiftsub.toggle.on') : $.lang.get('subscribehandler.massgiftsub.toggle.off')))
}
/*
* @commandpath massanongiftsubwelcometoggle - Enable or disable mass anonymous subgifting alerts.
*/
if (command.equalsIgnoreCase('massanongiftsubwelcometoggle')) {
massAnonGiftSubWelcomeToggle = !massAnonGiftSubWelcomeToggle;
$.setIniDbBoolean('subscribeHandler', 'massAnonGiftSubWelcomeToggle', massAnonGiftSubWelcomeToggle);
$.say($.whisperPrefix(sender) + (massAnonGiftSubWelcomeToggle ? $.lang.get('subscribehandler.anonmassgiftsub.toggle.on') : $.lang.get('subscribehandler.anonmassgiftsub.toggle.off')))
}
/*
* @commandpath submessage [message] - Set a welcome message for new subscribers.
*/
if (command.equalsIgnoreCase('submessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.sub.msg.usage'));
return;
}
subMessage = argsString;
$.setIniDbString('subscribeHandler', 'subscribeMessage', subMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.sub.msg.set'));
}
/*
* @commandpath primesubmessage [message] - Set a welcome message for new Twitch Prime subscribers.
*/
if (command.equalsIgnoreCase('primesubmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.primesub.msg.usage'));
return;
}
primeSubMessage = argsString;
$.setIniDbString('subscribeHandler', 'primeSubscribeMessage', primeSubMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.primesub.msg.set'));
}
/*
* @commandpath resubmessage [message] - Set a message for resubscribers.
*/
if (command.equalsIgnoreCase('resubmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.resub.msg.usage'));
return;
}
reSubMessage = argsString;
$.setIniDbString('subscribeHandler', 'reSubscribeMessage', reSubMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.resub.msg.set'));
}
/*
* @commandpath giftsubmessage [message] - Set a message for resubscribers.
*/
if (command.equalsIgnoreCase('giftsubmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.giftsub.msg.usage'));
return;
}
giftSubMessage = argsString;
$.setIniDbString('subscribeHandler', 'giftSubMessage', giftSubMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.giftsub.msg.set'));
}
/*
* @commandpath giftanonsubmessage[message] - Set a message for anonymous gifting alerts.
*/
if (command.equalsIgnoreCase('giftanonsubmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.giftanonsub.msg.usage'));
return;
}
giftAnonSubMessage = argsString;
$.setIniDbString('subscribeHandler', 'giftAnonSubMessage', giftAnonSubMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.giftanonsub.msg.set'));
}
/*
* @commandpath massgiftsubmessage [message] - Set a message for gifting alerts.
*/
if (command.equalsIgnoreCase('massgiftsubmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.massgiftsub.msg.usage'));
return;
}
massGiftSubMessage = argsString;
$.setIniDbString('subscribeHandler', 'massGiftSubMessage', massGiftSubMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.massgiftsub.msg.set'));
}
/*
* @commandpath massanongiftsubmessage [message] - Set a message for mass anonymous gifting alerts.
*/
if (command.equalsIgnoreCase('massanongiftsubmessage')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.anonmassgiftsub.msg.usage'));
return;
}
massAnonGiftSubMessage = argsString;
$.setIniDbString('subscribeHandler', 'massAnonGiftSubMessage', massAnonGiftSubMessage);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.anonmassgiftsub.msg.set'));
}
/**
* @commandpath subscribereward [points] - Set an award for subscribers.
*/
if (command.equalsIgnoreCase('subscribereward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.sub.reward.usage'));
return;
}
subReward = parseInt(action);
$.setIniDbNumber('subscribeHandler', 'subscribeReward', subReward);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.sub.reward.set'));
}
/**
* @commandpath resubscribereward [points] - Set an award for resubscribers.
*/
if (command.equalsIgnoreCase('resubscribereward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.resub.reward.usage'));
return;
}
reSubReward = parseInt(action);
$.setIniDbNumber('subscribeHandler', 'reSubscribeReward', reSubReward);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.resub.reward.set'));
}
/**
* @commandpath giftsubreward [points] - Set an award for gifted subs.
*/
if (command.equalsIgnoreCase('giftsubreward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.giftsub.reward.usage'));
return;
}
giftSubReward = parseInt(action);
$.setIniDbNumber('subscribeHandler', 'giftSubReward', giftSubReward);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.giftsub.reward.set'));
}
/**
* @commandpath massgiftsubreward [points] - Set an award for mass subs. This is a multiplier.
*/
if (command.equalsIgnoreCase('massgiftsubreward')) {
if (isNaN(parseInt(action))) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.massgiftsub.reward.usage'));
return;
}
massGiftSubReward = parseInt(action);
$.setIniDbNumber('subscribeHandler', 'massGiftSubReward', massGiftSubReward);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.massgiftsub.reward.set'));
}
/*
* @commandpath resubemote [emote] - The (customemote) tag will be replace with that emote. The emote will be added the amount of months the user subscribed for.
*/
if (command.equalsIgnoreCase('resubemote')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.resubemote.usage'));
return;
}
customEmote = action;
$.setIniDbString('subscribeHandler', 'resubEmote', customEmote);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.resubemote.set'));
}
/*
* @commandpath namesubplan [1|2|3] [name of plan] - Name a subscription plan, Twitch provides three tiers.
*/
if (command.equalsIgnoreCase('namesubplan')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.namesubplan.usage'));
return;
}
if (!action.equals('1') && !action.equals('2') && !action.equals('3')) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.namesubplan.usage'));
return;
}
if (action.equals('1')) {
planId = 'subPlan1000';
} else if (action.equals('2')) {
planId = 'subPlan2000';
} else if (action.equals('3')) {
planId = 'subPlan3000';
}
if (args[1] === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.namesubplan.show', action, $.getIniDbString('subscribeHandler', planId)));
return;
}
argsString = args.splice(1).join(' ');
if (planId.equals('subPlan1000')) {
subPlan1000 = argsString;
} else if (planId.equals('subPlan2000')) {
subPlan2000 = argsString;
} else if (planId.equals('subPlan3000')) {
subPlan3000 = argsString;
}
$.setIniDbString('subscribeHandler', planId, argsString);
$.say($.whisperPrefix(sender) + $.lang.get('subscribehandler.namesubplan.set', action, argsString));
return;
}
});
/**
* @event initReady
*/
$.bind('initReady', function () {
$.registerChatCommand('./handlers/subscribeHandler.js', 'subwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'resubemote', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'primesubwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'resubwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'giftsubwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'giftanonsubwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'massgiftsubwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'massanongiftsubwelcometoggle', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'subscribereward', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'resubscribereward', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'giftsubreward', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'massgiftsubreward', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'submessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'primesubmessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'resubmessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'giftsubmessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'giftanonsubmessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'massgiftsubmessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'massanongiftsubmessage', 1);
$.registerChatCommand('./handlers/subscribeHandler.js', 'namesubplan', 1);
announce = true;
});
$.updateSubscribeConfig = updateSubscribeConfig;
})();

View File

@@ -0,0 +1,262 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* tipeeestreamHandler.js
*
* Gets donation from the TipeeeStream API and posts them in Twitch chat.
*/
(function() {
var message = $.getSetIniDbString('tipeeeStreamHandler', 'message', $.lang.get('tipeeestream.donation.new')),
toggle = $.getSetIniDbBoolean('tipeeeStreamHandler', 'toggle', false),
reward = $.getSetIniDbFloat('tipeeeStreamHandler', 'reward', 0),
group = $.getSetIniDbBoolean('tipeeeStreamHandler', 'group', false),
groupMin = $.getSetIniDbNumber('tipeeeStreamHandler', 'groupMin', 5),
dir = './addons/tipeeeStream',
announce = false;
/*
* @function reloadTipeeeStream
*/
function reloadTipeeeStream() {
message = $.getIniDbString('tipeeeStreamHandler', 'message');
toggle = $.getIniDbBoolean('tipeeeStreamHandler', 'toggle');
reward = $.getIniDbFloat('tipeeeStreamHandler', 'reward');
group = $.getIniDbBoolean('tipeeeStreamHandler', 'group');
groupMin = $.getIniDbNumber('tipeeeStreamHandler', 'groupMin');
}
/*
* @event tipeeeStreamDonationInitialized
*/
$.bind('tipeeeStreamDonationInitialized', function(event) {
if (!$.bot.isModuleEnabled('./handlers/tipeeeStreamHandler.js')) {
return;
}
if (!$.isDirectory(dir)) {
$.consoleDebug('>> Creating the TipeeeStream Handler Directory: ' + dir);
$.mkDir(dir);
}
$.consoleLn('>> Enabling TipeeeStream donation announcements');
$.log.event('TipeeeStream donation announcements enabled');
announce = true;
});
/*
* @event tipeeeStreamDonation
*/
$.bind('tipeeeStreamDonation', function(event) {
if (!$.bot.isModuleEnabled('./handlers/tipeeeStreamHandler.js')) {
return;
}
var jsonString = event.getJsonString(),
JSONObject = Packages.org.json.JSONObject,
donationObj = new JSONObject(jsonString),
donationID = donationObj.getInt('id'),
paramObj = donationObj.getJSONObject('parameters'),
donationUsername = paramObj.getString('username'),
donationCurrency = paramObj.getString('currency'),
donationMessage = (paramObj.has('message') ? paramObj.getString('message') : ''),
donationAmount = paramObj.getInt('amount'),
donationFormattedAmount = donationObj.getString('formattedAmount'),
s = message;
if ($.inidb.exists('donations', donationID)) {
return;
}
$.inidb.set('streamInfo', 'lastDonator', donationUsername);
$.inidb.set('donations', donationID, donationObj);
$.inidb.set('donations', 'last_donation', donationID);
$.inidb.set('donations', 'last_donation_message', $.lang.get('main.donation.last.tip.message', donationUsername, donationCurrency, donationAmount));
$.writeToFile(donationUsername + ": " + donationAmount + " ", dir + '/latestDonation.txt', false);
if (toggle === true && announce === true) {
if (s.match(/\(name\)/)) {
s = $.replace(s, '(name)', donationUsername);
}
if (s.match(/\(currency\)/)) {
s = $.replace(s, '(currency)', donationCurrency);
}
if (s.match(/\(amount\)/)) {
s = $.replace(s, '(amount)', parseInt(donationAmount.toFixed(2)));
}
if (s.match(/\(amount\.toFixed\(0\)\)/)) {
s = $.replace(s, '(amount.toFixed(0))', parseInt(donationAmount.toFixed(0)));
}
if (s.match(/\(message\)/)) {
s = $.replace(s, '(message)', donationMessage);
}
if (s.match(/\(formattedamount\)/)) {
s = $.replace(s, '(formattedamount)', donationFormattedAmount);
}
if (s.match(/\(reward\)/)) {
s = $.replace(s, '(reward)', $.getPointsString(Math.floor(parseFloat(donationAmount) * reward)));
}
if (s.match(/\(alert [,.\w\W]+\)/g)) {
var filename = s.match(/\(alert ([,.\w\W]+)\)/)[1];
$.alertspollssocket.alertImage(filename);
s = (s + '').replace(/\(alert [,.\w\W]+\)/, '');
if (s == '') {
return null;
}
}
if (s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/g)) {
if (!$.audioHookExists(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1])) {
$.log.error('Could not play audio hook: Audio hook does not exist.');
return null;
}
$.alertspollssocket.triggerAudioPanel(s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[1]);
s = $.replace(s, s.match(/\(playsound\s([a-zA-Z1-9_]+)\)/)[0], '');
if (s == '') {
return null;
}
}
if (s != '') {
$.say(s);
}
}
if (reward > 0) {
$.inidb.incr('points', donationUsername.toLowerCase(), Math.floor(parseFloat(donationAmount) * reward));
}
if (group === true) {
donationUsername = donationUsername.toLowerCase();
$.inidb.incr('donations', donationUsername, donationAmount);
if ($.inidb.exists('donations', donationUsername) && $.inidb.get('donations', donationUsername) >= groupMin) {
if ($.getUserGroupId(donationUsername) > 3) {
$.setUserGroupById(donationUsername, '4');
}
}
}
});
/*
* @event command
*/
$.bind('command', function(event) {
var sender = event.getSender().toLowerCase(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0],
subAction = args[1];
/*
* @commandpath tipeeestream - Controls various options for donation handling
*/
if (command.equalsIgnoreCase('tipeeestream')) {
if (action === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donations.usage'));
return;
}
/*
* @commandpath tipeeestream toggledonators - Toggles the Donator's group.
*/
if (action.equalsIgnoreCase('toggledonators')) {
group = !group;
$.setIniDbBoolean('tipeeeStreamHandler', 'group', group);
$.say($.whisperPrefix(sender) + (group ? $.lang.get('tipeeestream.enabled.donators') : $.lang.get('tipeeestream.disabled.donators')));
}
/*
* @commandpath tipeeestream minmumbeforepromotion - Set the minimum before people get promoted to a Donator
*/
if (action.equalsIgnoreCase('minmumbeforepromotion')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donators.min.usage'));
return;
}
groupMin = subAction;
$.setIniDbNumber('tipeeeStreamHandler', 'groupMin', groupMin);
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donators.min', groupMin));
}
/*
* @commandpath tipeeestream announce - Toggles announcements for donations off and on
*/
if (action.equalsIgnoreCase('announce')) {
toggle = !toggle;
$.setIniDbBoolean('tipeeeStreamHandler', 'toggle', toggle);
$.say($.whisperPrefix(sender) + (toggle ? $.lang.get('tipeeestream.donations.announce.enable') : $.lang.get('tipeeestream.donations.announce.disable')));
}
/*
* @commandpath tipeeestream rewardmultiplier [n.n] - Set a reward multiplier for donations.
*/
if (action.equalsIgnoreCase('rewardmultiplier')) {
if (isNaN(parseFloat(subAction))) {
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donations.reward.usage'));
return;
}
reward = parseFloat(subAction);
$.setIniDbFloat('tipeeeStreamHandler', 'reward', reward);
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donations.reward.success', subAction, (subAction == "1" ? $.pointNameSingle : $.pointNameMultiple).toLowerCase()));
}
/*
* @commandpath tipeeestream message [message text] - Set the donation message. Tags: (name), (amount), (reward), (message) and (currency)
*/
if (action.equalsIgnoreCase('message')) {
if (subAction === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donations.message.usage'));
return;
}
var msg = args.splice(1).join(' ');
if (msg.search(/\(name\)/) == -1) {
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donations.message.no-name'));
return;
}
$.setIniDbString('tipeeeStreamHandler', 'message', msg);
message = $.getIniDbString('tipeeeStreamHandler', 'message');
$.say($.whisperPrefix(sender) + $.lang.get('tipeeestream.donations.message.success', msg));
}
}
});
/**
* @event initReady
*/
$.bind('initReady', function() {
$.registerChatCommand('./handlers/tipeeeStreamHandler.js', 'tipeeestream', 1);
});
$.reloadTipeeeStream = reloadTipeeeStream;
})();

View File

@@ -0,0 +1,580 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* twitterHandler.js
*
* Interfaces with Twitter. Provides the connection to the Core to be provided
* with Tweets and configuration of the module. As the Core directly reads the
* DB for configuration, there is not a need for local variables in this module.
*
*/
/**
* Anything you modify or remove in this script is at your own risk with Twitter.
*/
(function() {
var randPrev = 0,
onlinePostDelay = 480 * 6e4, // 8 hour cooldown
gameChangeDelay = 60 * 6e4, // 1 hour cooldown
interval;
/* Set default values for all configuration items. */
$.getSetIniDbString('twitter', 'message_online', 'Starting up a stream (twitchurl)');
$.getSetIniDbString('twitter', 'message_gamechange', 'Changing game over to (game) (twitchurl)');
$.getSetIniDbString('twitter', 'message_update', 'Still streaming (game) [(uptime)] (twitchurl)');
$.getSetIniDbNumber('twitter', 'polldelay_mentions', 60);
$.getSetIniDbNumber('twitter', 'polldelay_retweets', 60);
$.getSetIniDbNumber('twitter', 'polldelay_hometimeline', 60);
$.getSetIniDbNumber('twitter', 'polldelay_usertimeline', 15);
$.getSetIniDbNumber('twitter', 'postdelay_update', 180);
$.getSetIniDbNumber('twitter', 'reward_points', 100);
$.getSetIniDbNumber('twitter', 'reward_cooldown', 4);
$.getSetIniDbBoolean('twitter', 'poll_mentions', false);
$.getSetIniDbBoolean('twitter', 'poll_retweets', false);
$.getSetIniDbBoolean('twitter', 'poll_hometimeline', false);
$.getSetIniDbBoolean('twitter', 'poll_usertimeline', false);
$.getSetIniDbBoolean('twitter', 'post_online', false);
$.getSetIniDbBoolean('twitter', 'post_gamechange', false);
$.getSetIniDbBoolean('twitter', 'post_update', false);
$.getSetIniDbBoolean('twitter', 'reward_toggle', false);
$.getSetIniDbBoolean('twitter', 'reward_announce', false);
/**
* @event twitter
*/
$.bind('twitter', function(event) {
if (!$.bot.isModuleEnabled('./handlers/twitterHandler.js')) {
return;
}
if (event.getMentionUser() != null) {
$.say($.lang.get('twitter.tweet.mention', event.getMentionUser(), event.getTweet()).replace('(twitterid)', $.twitter.getUsername() + ''));
} else {
$.say($.lang.get('twitter.tweet', event.getTweet()).replace('(twitterid)', $.twitter.getUsername() + ''));
}
});
/**
* @event twitterRetweet
*/
$.bind('twitterRetweet', function(event) {
if (!$.bot.isModuleEnabled('./handlers/twitterHandler.js')) {
return;
}
/* The core only generates this event if reward_toggle is enabled, therefore, we do not check the toggle here. */
if ($.getIniDbNumber('twitter', 'reward_points') == 0) {
return;
}
var userNameArray = event.getUserNameArray(),
i,
twitterUserName,
rewardNameArray = [],
lastRetweet,
userName,
reward = $.getIniDbNumber('twitter', 'reward_points'),
cooldown = $.getIniDbFloat('twitter', 'reward_cooldown') * 3.6e6,
now = $.systemTime();
for (i in userNameArray) {
twitterUserName = userNameArray[i].toLowerCase();
userName = $.inidb.GetKeyByValue('twitter_mapping', '', twitterUserName);
if (userName === null) {
continue;
}
lastRetweet = $.getIniDbNumber('twitter_user_last_retweet', userName, 0);
if (now - lastRetweet > cooldown) {
rewardNameArray.push(userName);
$.inidb.incr('points', userName, reward);
$.setIniDbNumber('twitter_user_last_retweet', userName, now);
}
}
if (rewardNameArray.length > 0 && $.getIniDbBoolean('twitter', 'reward_announce')) {
$.say($.lang.get('twitter.reward.announcement', rewardNameArray.join(', '), $.getPointsString(reward)));
}
});
/**
* @event twitchOnline
*/
$.bind('twitchOnline', function(event) {
var randNum,
now = $.systemTime(),
message = $.getIniDbString('twitter', 'message_online');
if (!$.bot.isModuleEnabled('./handlers/twitterHandler.js')) {
return;
}
if ($.getIniDbBoolean('twitter', 'post_online', false)) {
if (now > $.getIniDbNumber('twitter', 'last_onlinepost', 0) + onlinePostDelay) {
$.inidb.set('twitter', 'last_onlinepost', now + onlinePostDelay);
do {
randNum = $.randRange(1, 9999);
} while (randNum == randPrev);
randPrev = randNum;
$.twitter.updateStatus(String(message).replace('(title)', $.twitchcache.getStreamStatus()).replace('(game)', $.twitchcache.getGameTitle()).replace('(twitchurl)', 'https://www.twitch.tv/' + $.ownerName + '?' + randNum).replace(/\(enter\)/g, '\r\n'));
}
}
});
/**
* @event twitchGameChange
*/
$.bind('twitchGameChange', function(event) {
var now = $.systemTime(),
message = $.getIniDbString('twitter', 'message_gamechange');
if (!$.bot.isModuleEnabled('./handlers/twitterHandler.js')) {
return;
}
if ($.twitchcache.getGameTitle() == '') {
return;
}
if ($.getIniDbBoolean('twitter', 'post_gamechange', false) && $.isOnline($.channelName)) {
if (now > $.getIniDbNumber('twitter', 'last_gamechange', 0) + gameChangeDelay) {
$.inidb.set('twitter', 'last_gamechange', now + gameChangeDelay);
var randNum,
uptimeSec = $.getStreamUptimeSeconds($.channelName),
hrs = (uptimeSec / 3600 < 10 ? '0' : '') + Math.floor(uptimeSec / 3600),
min = ((uptimeSec % 3600) / 60 < 10 ? '0' : '') + Math.floor((uptimeSec % 3600) / 60);
do {
randNum = $.randRange(1, 9999);
} while (randNum == randPrev);
randPrev = randNum;
$.twitter.updateStatus(String(message).replace('(title)', $.twitchcache.getStreamStatus()).replace('(game)', $.twitchcache.getGameTitle()).replace('(uptime)', hrs + ':' + min).replace('(twitchurl)', 'https://www.twitch.tv/' + $.ownerName + '?' + randNum).replace(/\(enter\)/g, '\r\n'));
}
}
});
/**
* @event command
*/
$.bind('command', function(event) {
var sender = event.getSender().toLowerCase(),
command = event.getCommand(),
args = event.getArgs(),
commandArg = args[0],
subCommandArg = args[1],
setCommandArg = args[2],
setCommandVal = args[3],
setCommandList = ['mentions', 'retweets', 'hometimeline', 'usertimeline'],
setRewardCommandList = ['toggle', 'points', 'cooldown', 'announce'],
minVal;
/**
* @commandpath twitter - Twitter base command
*/
if (command.equalsIgnoreCase('twitter')) {
if (commandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.id', $.ownerName, $.twitter.getUsername() + '') + ' ' + $.lang.get('twitter.usage.id'));
return;
}
/**
* @commandpath twitter usage - Display the Twitter usage
*/
if (commandArg.equalsIgnoreCase('usage')) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.usage'));
return;
}
/**
* @commandpath twitter set - Twitter configuration base command
*/
if (commandArg.equalsIgnoreCase('set')) {
if (subCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.usage'));
return;
}
/**
* @commandpath twitter set reward - Base command for retweet rewards
*/
if (subCommandArg.equalsIgnoreCase('reward')) {
if (setCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.usage'));
return;
}
/**
* @commandpath twitter set reward toggle [on/off] - Reward users that retweet.
* @commandpath twitter set reward points [points] - Amount of points to reward a retweet.
* @commandpath twitter set reward cooldown [hours] - Number of hours to wait between another retweet reward.
* @commandpath twitter set reward announce [on/off] - Announce retweet rewards in chat.
*/
if (setRewardCommandList.indexOf(setCommandArg + '') === -1) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.usage'));
return;
}
if (setCommandVal === undefined) {
if (setCommandArg.equalsIgnoreCase('toggle') || setCommandArg.equalsIgnoreCase('announce')) {
setCommandVal = $.getIniDbBoolean('twitter', 'reward_' + setCommandArg, false);
setCommandVal = setCommandVal ? 'on' : 'off';
} else {
setCommandVal = $.getIniDbFloat('twitter', 'reward_' + setCommandArg);
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.' + setCommandArg + '.usage', setCommandVal));
return;
}
if (setCommandArg.equalsIgnoreCase('toggle') || setCommandArg.equalsIgnoreCase('announce')) {
if (!setCommandVal.equalsIgnoreCase('on') && !setCommandVal.equalsIgnoreCase('off')) {
setCommandVal = $.getIniDbBoolean('twitter', 'reward_' + setCommandArg, false);
setCommandVal = setCommandVal ? 'on' : 'off';
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.' + setCommandArg + '.usage', setCommandVal));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.' + setCommandArg + '.success', setCommandVal.toLowerCase()));
setCommandVal = setCommandVal.equalsIgnoreCase('on') ? 'true' : 'false';
$.inidb.set('twitter', 'reward_' + setCommandArg, setCommandVal);
} else {
if (isNaN(setCommandVal)) {
setCommandVal = $.getIniDbNumber('twitter', 'reward_' + setCommandArg);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.' + setCommandArg + '.usage', setCommandVal));
return;
}
$.inidb.set('twitter', 'reward_' + setCommandArg, setCommandVal);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.reward.' + setCommandArg + '.success', setCommandVal));
return;
}
}
/**
* @commandpath twitter set polldelay - Twitter poll delay base command
*/
if (subCommandArg.equalsIgnoreCase('polldelay')) {
if (setCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.polldelay.usage'));
return;
}
/**
* @commandpath twitter set polldelay mentions [seconds] - Poll delay for mentions in seconds. Minimum is 60.
* @commandpath twitter set polldelay retweets [seconds] - Poll delay for retweets in seconds. Minimum is 60.
* @commandpath twitter set polldelay hometimeline [seconds] - Poll delay for home timeline in seconds. Minimum is 60.
* @commandpath twitter set polldelay usertimeline [seconds] - Poll delay for user timeline in seconds. Minimum is 15.
*/
if (setCommandList.indexOf(setCommandArg + '') === -1) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.polldelay.usage'));
return;
}
if (setCommandVal === undefined) {
setCommandVal = $.getIniDbNumber('twitter', 'polldelay_' + setCommandArg, setCommandArg.equalsIgnoreCase('usertimeline') ? 15 : 60);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.polldelay.' + setCommandArg + '.usage', setCommandVal));
return;
}
if (isNaN(setCommandVal)) {
setCommandVal = $.getIniDbNumber('twitter', 'polldelay_' + setCommandArg, setCommandArg.equalsIgnoreCase('usertimeline') ? 15 : 60);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.polldelay.' + setCommandArg + '.usage', setCommandVal));
return;
}
minVal = setCommandArg.equalsIgnoreCase('usertimeline') ? 15 : 60;
if (parseInt(setCommandVal) < minVal) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.polldelay.minerror', minVal));
return;
}
$.inidb.set('twitter', 'polldelay_' + setCommandArg, setCommandVal);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.polldelay.' + setCommandArg + '.success', setCommandVal));
return;
}
/**
* @commandpath twitter set poll - Twitter poll configuration base command
*/
if (subCommandArg.equalsIgnoreCase('poll')) {
if (setCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.poll.usage'));
return;
}
/**
* @commandpath twitter set poll mentions [on/off] - Poll mentions from Twitter.
* @commandpath twitter set poll retweets [on/off] - Poll retweets from Twitter.
* @commandpath twitter set poll hometimeline [on/off] - Poll home timeline from Twitter. Disables all other polling in the Core.
* @commandpath twitter set poll usertimeline [on/off] - Poll user timeline from Twitter.
*/
if (setCommandList.indexOf(setCommandArg + '') === -1) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.poll.usage'));
return;
}
if (setCommandVal === undefined) {
setCommandVal = $.getIniDbBoolean('twitter', 'poll_' + setCommandArg, false);
setCommandVal = setCommandVal ? 'on' : 'off';
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.poll.' + setCommandArg + '.usage', setCommandVal));
return;
}
if (!setCommandVal.equalsIgnoreCase('on') && !setCommandVal.equalsIgnoreCase('off')) {
setCommandVal = $.getIniDbBoolean('twitter', 'poll_' + setCommandArg, false);
setCommandVal = setCommandVal ? 'on' : 'off';
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.poll.' + setCommandArg + '.usage', setCommandVal));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.poll.' + setCommandArg + '.success', setCommandVal.toLowerCase()));
setCommandVal = setCommandVal.equalsIgnoreCase('on') ? 'true' : 'false';
$.inidb.set('twitter', 'poll_' + setCommandArg, setCommandVal);
return;
}
/**
* @commandpath twitter set post - Twitter automatic post configuration base command
*/
if (subCommandArg.equalsIgnoreCase('post')) {
if (setCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.post.usage'));
return;
}
/**
* @commandpath twitter set post online [on/off] - Automatically post when the stream is detected as going online.
* @commandpath twitter set post gamechange [on/off] - Automatically post when a game change is peformed via the !game command.
* @commandpath twitter set post update [on/off] - Automatically post an update to Twitter on a timed interval (!twitter set updatetimer).
*/
if (!setCommandArg.equalsIgnoreCase('online') && !setCommandArg.equalsIgnoreCase('gamechange') && !setCommandArg.equalsIgnoreCase('update')) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.post.usage'));
return;
}
if (setCommandVal === undefined) {
setCommandVal = $.getIniDbBoolean('twitter', 'post_' + setCommandArg, false);
setCommandVal = setCommandVal ? 'on' : 'off';
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.post.' + setCommandArg + '.usage', setCommandVal));
return;
}
if (!setCommandVal.equalsIgnoreCase('on') && !setCommandVal.equalsIgnoreCase('off')) {
setCommandVal = $.getIniDbBoolean('twitter', 'post_' + setCommandArg, false);
setCommandVal = setCommandVal ? 'on' : 'off';
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.post.' + setCommandArg + '.usage', setCommandVal));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.post.' + setCommandArg + '.success', setCommandVal.toLowerCase()));
setCommandVal = setCommandVal.equalsIgnoreCase('on') ? 'true' : 'false';
$.inidb.set('twitter', 'post_' + setCommandArg, setCommandVal);
return;
}
/**
* @commandpath twitter set updatetimer [minutes] - Twitter automatic post timer. Posts updates about the stream in progress.
*/
if (subCommandArg.equalsIgnoreCase('updatetimer')) {
setCommandVal = setCommandArg;
if (setCommandVal == undefined) {
setCommandVal = $.getIniDbNumber('twitter', 'postdelay_update');
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.updatetimer.usage', setCommandVal));
return;
}
if (isNaN(setCommandVal)) {
setCommandVal = $.getIniDbNumber('twitter', 'postdelay_update');
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.updatetimer.usage', setCommandVal));
return;
}
if (parseInt(setCommandVal) <= 180) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.updatetimer.toosmall', setCommandVal));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.updatetimer.success', setCommandVal));
$.inidb.set('twitter', 'postdelay_update', setCommandVal);
return;
}
/**
* @commandpath twitter set message - Twitter automatic post message configuration base command
*/
if (subCommandArg.equalsIgnoreCase('message')) {
if (setCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.message.usage'));
return;
}
/**
* @commandpath twitter set message online [message] - Configures message that is sent out when stream goes online. Tags: (game) (twitchurl)
* @commandpath twitter set message gamechange [message] - Configures message that is sent out on game change. Tags: (game) (twitchurl)
* @commandpath twitter set message update [message] - Configures message that is sent out on an interval basis. Tags: (game) (twitchurl) (uptime)
*/
if (!setCommandArg.equalsIgnoreCase('online') && !setCommandArg.equalsIgnoreCase('gamechange') && !setCommandArg.equalsIgnoreCase('update')) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.message.usage'));
return;
}
if (setCommandVal === undefined) {
setCommandVal = $.getIniDbString('twitter', 'message_' + setCommandArg);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.message.' + setCommandArg + '.usage', setCommandVal));
return;
}
setCommandVal = args.splice(3).join(' ');
$.say($.whisperPrefix(sender) + $.lang.get('twitter.set.message.' + setCommandArg + '.success', setCommandVal));
$.inidb.set('twitter', 'message_' + setCommandArg, setCommandVal);
return;
}
}
/**
* @commandpath twitter post [message] - Post a message to Twitter
*/
if (commandArg.equalsIgnoreCase('post')) {
if (args.length === 1) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.post.usage'));
return;
}
var retval = $.twitter.updateStatus(String(args.splice(1).join(' ')).replace(/\(enter\)/g, '\r\n')) + '';
if (retval.equals('true')) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.post.sent', args.splice(1).join(' ')));
} else {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.post.failed'));
}
return;
}
/**
* @commandpath twitter lasttweet - Display the last Tweet on the home or user timeline
*/
if (commandArg.equalsIgnoreCase('lasttweet')) {
if ($.getIniDbBoolean('twitter', 'poll_hometimeline', false)) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lasttweet', $.getIniDbString('twitter', 'last_hometimeline', 'No Tweets have been pulled yet!')));
return;
}
if ($.getIniDbBoolean('twitter', 'poll_usertimeline', false)) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lasttweet', $.getIniDbString('twitter', 'last_usertimeline', 'No Tweets have been pulled yet!')));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lasttweet.disabled'));
return;
}
/**
* @commandpath twitter lastmention - Display the last @mention from Twitter
*/
if (commandArg.equalsIgnoreCase('lastmention')) {
if ($.getIniDbBoolean('twitter', 'poll_mentions', false)) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lastmention', $.getIniDbString('twitter', 'last_mentions', 'No Mentions have been pulled yet!')));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lastmention.disabled'));
return;
}
/**
* @commandpath twitter lastretweet - Display the last retweeted message on Twitter
*/
if (commandArg.equalsIgnoreCase('lastretweet')) {
if ($.getIniDbBoolean('twitter', 'poll_retweets', false)) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lastretweet', $.getIniDbString('twitter', 'last_retweets', 'No Retweets have been pulled yet!')));
return;
}
$.say($.whisperPrefix(sender) + $.lang.get('twitter.lastretweet.disabled'));
return;
}
/**
* @commandpath twitter id - Display the configured Twitter ID for the caster
*/
if (commandArg.equalsIgnoreCase('id')) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.id', $.ownerName, $.twitter.getUsername() + ''));
return;
}
/**
* @commandpath twitter register [twitter_id] - Register your Twitter username
*/
if (commandArg.equalsIgnoreCase('register')) {
if (subCommandArg === undefined) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.register.usage', $.getIniDbString('twitter_mapping', sender, $.lang.get('twitter.register.notregistered'))));
return;
}
if ($.inidb.GetKeyByValue('twitter_mapping', '', subCommandArg.toLowerCase()) !== null) {
$.say($.whisperPrefix(sender) + $.lang.get('twitter.register.inuse', subCommandArg.toLowerCase()));
return;
}
$.setIniDbString('twitter_mapping', sender, subCommandArg.toLowerCase());
$.say($.whisperPrefix(sender) + $.lang.get('twitter.register.success', subCommandArg.toLowerCase()));
return;
}
/**
* @commandpath twitter unregister - Unregister your Twitter username
*/
if (commandArg.equalsIgnoreCase('unregister')) {
$.inidb.del('twitter_mapping', sender);
$.say($.whisperPrefix(sender) + $.lang.get('twitter.unregister'));
return;
}
} /* if (command.equalsIgnoreCase('twitter')) */
}); /* @event command */
/**
* @function checkAutoUpdate
*/
function checkAutoUpdate() {
var message = $.getIniDbString('twitter', 'message_update');
/*
* If not online, nothing to do. The last_autoupdate is reset to ensure that
* the moment a stream comes online an additional Tweet is not sent out.
*/
if (!$.isOnline($.channelName)) {
$.inidb.set('twitter', 'last_autoupdate', $.systemTime());
return;
}
if ($.getIniDbBoolean('twitter', 'post_update', false)) {
var lastUpdateTime = $.getSetIniDbNumber('twitter', 'last_autoupdate', $.systemTime());
if (($.systemTime() - lastUpdateTime) >= ($.getIniDbNumber('twitter', 'postdelay_update', 180) * 6e4)) { // 3 hour cooldown
var DownloadHTTP = Packages.com.illusionaryone.ImgDownload;
var success = DownloadHTTP.downloadHTTP($.twitchcache.getPreviewLink(), 'twitch-preview.jpg'),
uptimeSec = $.getStreamUptimeSeconds($.channelName),
hrs = (uptimeSec / 3600 < 10 ? '0' : '') + Math.floor(uptimeSec / 3600),
min = ((uptimeSec % 3600) / 60 < 10 ? '0' : '') + Math.floor((uptimeSec % 3600) / 60);
$.inidb.set('twitter', 'last_autoupdate', $.systemTime());
if (success.equals('true')) {
$.twitter.updateStatus(String(message).replace('(title)', $.twitchcache.getStreamStatus()).replace('(game)', $.twitchcache.getGameTitle()).replace('(twitchurl)', 'https://www.twitch.tv/' + $.ownerName + '?' + uptimeSec).replace(/\(enter\)/g, '\r\n').replace('(uptime)', hrs + ':' + min),
'./addons/downloadHTTP/twitch-preview.jpg');
} else {
$.twitter.updateStatus(String(message).replace('(title)', $.twitchcache.getStreamStatus()).replace('(game)', $.twitchcache.getGameTitle()).replace('(twitchurl)', 'https://www.twitch.tv/' + $.ownerName + '?' + uptimeSec).replace('(uptime)', hrs + ':' + min).replace(/\(enter\)/g, '\r\n'));
}
$.log.event('Sent Auto Update to Twitter');
}
}
}
interval = setInterval(function() {
checkAutoUpdate();
}, 8e4);
/**
* @event initReady
*/
$.bind('initReady', function() {
$.registerChatCommand('./handlers/twitterHandler.js', 'twitter', 7);
$.registerChatSubcommand('twitter', 'set', 1);
$.registerChatSubcommand('twitter', 'post', 1);
$.registerChatSubcommand('twitter', 'lasttweet', 7);
$.registerChatSubcommand('twitter', 'lastmention', 7);
$.registerChatSubcommand('twitter', 'lastretweet', 7);
$.registerChatSubcommand('twitter', 'id', 7);
$.registerChatSubcommand('twitter', 'register', 7);
$.registerChatSubcommand('twitter', 'unregister', 7);
});
})();

View File

@@ -0,0 +1,115 @@
/*
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
(function() {
/**
* @event command
*/
$.bind('command', function(event) {
var sender = event.getSender(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0],
subAction = args[1];
/**
* @commandpath wordcounter - Configures various option for the wordcounter
*/
if (command.equalsIgnoreCase('wordcounter')) {
if (!action) {
$.say($.whisperPrefix(sender) + $.lang.get('wordcounter.usage'));
return;
}
/**
* @commandpath wordcounter add [word] - Adds a word that will be counted every time someone says it
*/
if (action.equalsIgnoreCase('add')) {
if (!subAction) {
$.say($.whisperPrefix(sender) + $.lang.get('wordcounter.add.usage'));
return;
}
subAction = subAction.replace(action, '').toLowerCase();
$.inidb.set('wordCounter', subAction, 0);
$.say(subAction + $.lang.get('wordcounter.added'));
$.log.event(sender + ' added "' + subAction + '" to the word counter list');
}
/**
* @commandpath wordcounter remove [word] - Removes the given word which will no longer be counted every time someone says it
*/
if (action.equalsIgnoreCase('remove')) {
if (!subAction) {
$.say($.whisperPrefix(sender) + $.lang.get('wordcounter.remove.usage'));
return;
} else if (!$.inidb.exists('wordCounter', subAction)) {
$.say($.whisperPrefix(sender) + $.lang.get('wordcounter.err.404'));
return;
}
subAction = subAction.replace(action, '').toLowerCase();
$.inidb.del('wordCounter', subAction);
$.say(subAction + $.lang.get('wordcounter.removed'));
$.log.event(sender + ' removed "' + subAction + '" from the word counter list');
}
}
/**
* @commandpath count [word] - Tells you how many times that word as been said in chat.
*/
if (command.equalsIgnoreCase('count')) {
if (!action || !$.inidb.exists('wordCounter', action.toLowerCase())) {
$.say($.whisperPrefix(sender) + $.lang.get('wordcounter.err.404'));
return;
}
$.say($.lang.get('wordcounter.count', action, $.inidb.get('wordCounter', action.toLowerCase())));
}
});
/**
* @event ircChannelMessage
*/
$.bind('ircChannelMessage', function(event) {
var message = event.getMessage().toLowerCase(),
keys = $.inidb.GetKeyList('wordCounter', ''),
word,
key;
if ($.bot.isModuleEnabled('./handlers/wordCounter.js')) {
for (i in keys) {
key = keys[i].toLowerCase();
word = new RegExp('\\b' + key + '\\b', 'ig');
if (word.exec(message)) {
$.inidb.incr('wordCounter', key, 1);
break;
}
}
}
});
/**
* @event initReady
*/
$.bind('initReady', function() {
$.registerChatCommand('./handlers/wordCounter.js', 'wordcounter', 1);
$.registerChatCommand('./handlers/wordCounter.js', 'count', 7);
});
})();