/* * 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 . */ (function() { var currentGame = null; var count = 1; var gamesPlayed; /** * @event twitchOnline */ $.bind('twitchOnline', function(event) { if (($.systemTime() - $.inidb.get('panelstats', 'playTimeReset')) >= (480 * 6e4)) { var uptime = getStreamUptimeSeconds($.channelName); $.inidb.set('panelstats', 'gameCount', 1); count = $.inidb.get('panelstats', 'gameCount'); $.inidb.del('streamInfo', 'gamesPlayed'); $.inidb.set('panelstats', 'playTimeStart', $.systemTime()); $.inidb.set('panelstats', 'playTimeReset', $.systemTime()); $.inidb.set('streamInfo', 'gamesPlayed', (count + ': ' + $.twitchcache.getGameTitle() + ' - ' + (uptime / 3600 < 10 ? '0' : '') + Math.floor(uptime / 3600) + ':' + ((uptime % 3600) / 60 < 10 ? '0' : '') + Math.floor((uptime % 3600) / 60) + '=')); } }); /** * @event twitchOffline */ $.bind('twitchOffline', function(event) { if (($.systemTime() - $.inidb.get('panelstats', 'playTimeReset')) >= (480 * 6e4)) { $.inidb.set('panelstats', 'playTimeStart', 0); $.inidb.set('panelstats', 'playTimeReset', 0); $.inidb.set('panelstats', 'gameCount', 1); $.inidb.del('streamInfo', 'gamesPlayed'); } $.inidb.set('streamInfo', 'downtime', String($.systemTime())); }); /** * @event twitchGameChange */ $.bind('twitchGameChange', function(event) { var uptime = getStreamUptimeSeconds($.channelName); if ($.isOnline($.channelName)) { $.inidb.set('panelstats', 'playTimeStart', $.systemTime()); if ($.inidb.exists('streamInfo', 'gamesPlayed')) { $.inidb.incr('panelstats', 'gameCount', 1); count = $.inidb.get('panelstats', 'gameCount'); gamesPlayed = $.inidb.get('streamInfo', 'gamesPlayed'); gamesPlayed += (count + ': ' + $.twitchcache.getGameTitle() + ' - ' + (uptime / 3600 < 10 ? '0' : '') + Math.floor(uptime / 3600) + ':' + ((uptime % 3600) / 60 < 10 ? '0' : '') + Math.floor((uptime % 3600) / 60) + '='); $.inidb.set('streamInfo', 'gamesPlayed', gamesPlayed); } else { count = $.inidb.get('panelstats', 'gameCount'); $.inidb.set('streamInfo', 'gamesPlayed', (count + ': ' + $.twitchcache.getGameTitle() + ' - ' + (uptime / 3600 < 10 ? '0' : '') + Math.floor(uptime / 3600) + ':' + ((uptime % 3600) / 60 < 10 ? '0' : '') + Math.floor((uptime % 3600) / 60) + '=')); } } }); /** * @function getGamesPlayed() * @export $ * @return string */ function getGamesPlayed() { if ($.inidb.exists('streamInfo', 'gamesPlayed')) { var games = $.inidb.get('streamInfo', 'gamesPlayed'), string = games.split('=').join(', '); return string; } return ''; } /** * @function getPlayTime() * @export $ */ function getPlayTime() { var playTime = parseInt($.inidb.get('panelstats', 'playTimeStart')), time; if (playTime) { time = ($.systemTime() - playTime); return $.getTimeStringMinutes(time / 1000); } else { return null; } } /** * @function isOnline * @export $ * @param {string} channelName * @returns {boolean} */ function isOnline(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { return $.twitchcache.isStreamOnlineString().equals('true'); } else { return !$.twitch.GetStream(channelName).isNull('stream'); } } /** * @function getStatus * @export $ * @param {string} channelName * @returns {string} */ function getStatus(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { return ($.twitchcache.getStreamStatus() + ''); } else { var channelData = $.twitch.GetChannel(channelName); if (!channelData.isNull('status') && channelData.getInt('_http') == 200) { return channelData.getString('status'); } else if (channelData.isNull('status') && channelData.getInt('_http') == 200) { return $.lang.get('common.twitch.no.status'); } $.log.error('Failed to get the current status: ' + channelData.getString('message')); return ''; } } /** * @function getGame * @export $ * @param channelName * @returns {string} */ function getGame(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { return ($.twitchcache.getGameTitle() + ''); } else { var channelData = $.twitch.GetChannel(channelName); if (!channelData.isNull('game') && channelData.getInt('_http') == 200) { return channelData.getString("game"); } else if (channelData.isNull('game') && channelData.getInt('_http') == 200) { return $.lang.get('common.twitch.no.game'); } if (!channelData.isNull('message')) { $.log.error('Failed to get the current game: ' + channelData.getString('message')); } return ''; } } /** * @function getLogo * @export $ * @param channelName * @returns {Url} */ function getLogo(channelName) { var channel = $.twitch.GetChannel(channelName); if (!channel.isNull('logo') && channel.getInt('_http') == 200) { return channel.getString('logo'); } else { return 0; } } /** * @function getStreamUptimeSeconds * @export $ * @param channelName * @returns {number} */ function getStreamUptimeSeconds(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { return $.twitchcache.getStreamUptimeSeconds(); } else { var stream = $.twitch.GetStream(channelName), now = new Date(), createdAtDate, time; if (stream.isNull('stream')) { return 0; } createdAtDate = new Date(stream.getJSONObject('stream').getString('created_at')); if (createdAtDate) { time = (now - createdAtDate); return Math.floor(time / 1000); } else { return 0; } } } /** * @function getStreamUptime * @export $ * @param channelName * @returns {string} */ function getStreamUptime(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { var uptime = $.twitchcache.getStreamUptimeSeconds(); if (uptime === 0) { $.consoleLn("Fallback uptime"); var stream = $.twitch.GetStream(channelName), now = new Date(), createdAtDate, time; if (stream.isNull('stream')) { return ''; } createdAtDate = new Date(stream.getJSONObject('stream').getString('created_at')); time = (now - createdAtDate); return $.getTimeString(time / 1000); } return $.getTimeString(uptime); } else { var stream = $.twitch.GetStream(channelName), now = new Date(), createdAtDate, time; if (stream.isNull('stream')) { return ''; } createdAtDate = new Date(stream.getJSONObject('stream').getString('created_at')); if (createdAtDate) { time = now - createdAtDate; return $.getTimeString(time / 1000); } else { return ''; } } } /** * @function getStreamDownTime * @export $ * @returns {string} */ function getStreamDownTime() { var now = $.systemTime(), down = $.inidb.get('streamInfo', 'downtime'), time; if (down > 0) { time = (now - down); return $.getTimeString(time / 1000); } return 0; } /** * @function getStreamStartedAt * @export $ * @param channelName * @returns {string} */ function getStreamStartedAt(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { if ($.twitchcache.getStreamOnlineString === 'false') { return 'Stream is offline'; } createdAtDate = new Date($.twitchcache.getStreamCreatedAt() + ''); return $.dateToString(createdAtDate); } else { var stream = $.twitch.GetStream(channelName), createdAtDate; if (stream.isNull('stream')) { return 0; } createdAtDate = new Date(stream.getJSONObject('stream').getString('created_at')); return $.dateToString(createdAtDate); } } /** * @function getViewers * @export $ * @param channelName * @returns {Number} */ function getViewers(channelName) { if ($.twitchCacheReady.equals('true') && channelName.equalsIgnoreCase($.channelName)) { return $.twitchcache.getViewerCount(); } else { var stream = $.twitch.GetStream(channelName); if (!stream.isNull('stream') && stream.getInt('_http') == 200) { return stream.getJSONObject('stream').getInt('viewers'); } else { return 0; } } } /** * @function getFollows * @export $ * @param channelName * @returns {Number} */ function getFollows(channelName) { var channel = $.twitch.GetChannel(channelName); if (!channel.isNull('followers') && channel.getInt('_http') == 200) { return channel.getInt('followers'); } else { return 0; } } /** * @function getFollowDate * @export $ * @param username * @param channelName */ function getFollowDate(sender, username, channelName) { username = $.user.sanitize(username); channelName = $.user.sanitize(channelName); var user = $.twitch.GetUserFollowsChannel(username, channelName); if (user.getInt('_http') === 404) { return $.lang.get('followhandler.follow.age.datefmt.404'); } var date = new Date(user.getString('created_at')), dateFormat = new java.text.SimpleDateFormat($.lang.get('followhandler.follow.age.datefmt')), dateFinal = dateFormat.format(date); return dateFinal; } /** * @function getFollowAge * @export $ * @param username * @param channelName */ function getFollowAge(sender, username, channelName) { username = $.user.sanitize(username); channelName = $.user.sanitize(channelName); var user = $.twitch.GetUserFollowsChannel(username, channelName); if (user.getInt('_http') === 404) { $.say($.lang.get('followhandler.follow.age.err.404', $.userPrefix(sender, true), username, channelName)); return; } var date = new Date(user.getString('created_at')), dateFormat = new java.text.SimpleDateFormat("MMMM dd', 'yyyy"), dateFinal = dateFormat.format(date), days = Math.floor((($.systemTime() - date.getTime()) / 1000) / 86400); if (days > 0) { $.say($.lang.get('followhandler.follow.age.time.days', $.userPrefix(sender, true), username, channelName, dateFinal, days)); } else { $.say($.lang.get('followhandler.follow.age.time', $.userPrefix(sender, true), username, channelName, dateFinal)); } } /** * @function getChannelAge * @export $ * @param event */ function getChannelAge(event) { var channelData = $.twitch.GetChannel((!event.getArgs()[0] ? event.getSender() : $.user.sanitize(event.getArgs()[0]))); if (channelData.getInt('_http') === 404) { $.say($.userPrefix(event.getSender(), true) + $.lang.get('channel.age.user.404')); return; } var date = new Date(channelData.getString('created_at')), dateFormat = new java.text.SimpleDateFormat("MMMM dd', 'yyyy"), dateFinal = dateFormat.format(date), days = Math.floor((Math.abs((date.getTime() - $.systemTime()) / 1000)) / 86400); if (days > 0) { $.say($.lang.get('common.get.age.days', $.userPrefix(event.getSender(), true), (!event.getArgs()[0] ? event.getSender() : $.user.sanitize(event.getArgs()[0])), dateFinal, days)); } else { $.say($.lang.get('common.get.age', $.userPrefix(event.getSender(), true), (!event.getArgs()[0] ? event.getSender() : $.user.sanitize(event.getArgs()[0])), dateFinal)); } } /** * @function getSubscriberCount * @export $ * @return {number} count */ function getSubscriberCount() { var jsonObject = $.twitch.GetChannelSubscriptions($.channelName.toLowerCase(), 100, 0, true); if (jsonObject.getInt('_http') !== 200) { return 0; } return jsonObject.getInt('_total') - 1; } /** * @function updateGame * @export $ * @param {string} channelName * @param {string} game * @param {string} sender * @param {boolean} silent */ function updateGame(channelName, game, sender, silent) { var http = $.twitch.UpdateChannel(channelName, '', game); if (http.getBoolean('_success')) { if (http.getInt('_http') == 200) { if (!silent) { $.say($.lang.get('common.game.change', http.getString('game'))); } $.twitchcache.setGameTitle(http.getString('game')); $.inidb.set('streamInfo', 'game', http.getString('game')); $.log.event($.username.resolve(sender) + ' changed the current game to ' + http.getString('game')); if ($.bot.isModuleEnabled('./commands/deathctrCommand.js')) { $.deathUpdateFile(game); } } else { $.log.error('Failed to change the game. The Twitch API might be having issues.'); $.log.error(http.getString('message')); } } else { $.log.error('Failed to change the game. Make sure you have your api oauth code set. https://phantombot.github.io/PhantomBot/oauth/'); $.log.error(http.getString('_exception') + ' ' + http.getString('_exceptionMessage')); } } /** * @function updateStatus * @export $ * @param {string} channelName * @param {string} status * @param {string} sender * @param {boolean} silent */ function updateStatus(channelName, status, sender, silent) { var http = $.twitch.UpdateChannel(channelName, status, ''); if (http.getBoolean('_success')) { if (http.getInt('_http') == 200) { if (!silent) { $.say($.lang.get('common.title.change', http.getString('status'))); } $.twitchcache.setStreamStatus(http.getString('status')); $.inidb.set('streamInfo', 'title', http.getString('status')); $.log.event(sender + ' changed the current status to ' + http.getString('status')); } else { $.log.error('Failed to change the status. The Twitch API might be having issues.'); $.log.error(http.getString('message')); } } else { $.log.error('Failed to change the status. Make sure you have your api oauth code set. https://phantombot.github.io/PhantomBot/oauth/'); $.log.error(http.getString('_exception') + ' ' + http.getString('_exceptionMessage')); } } /** * @function updateStatus * @export $ * @param {string} channelName * @param {string} communities * @param {string} sender * @param {boolean} silent */ function updateCommunity(channelName, communities, sender, silent) { var http = $.twitch.UpdateCommunities(channelName, communities); if (http.getBoolean('_success') && http.getInt('_http') == 204) { if (!silent) { $.say($.lang.get('common.communities.change')); } $.twitchcache.setCommunities(communities); $.inidb.set('streamInfo', 'communities', communities.join(', ')); } else { $.log.error('Failed to change the status. Make sure you have your api oauth code set. https://phantombot.github.io/PhantomBot/oauth/'); $.log.error(http.getString('_exception') + ' ' + http.getString('_exceptionMessage')); } } /** Export functions to API */ $.getPlayTime = getPlayTime; $.getFollows = getFollows; $.getGame = getGame; $.getLogo = getLogo; $.getStatus = getStatus; $.getStreamStartedAt = getStreamStartedAt; $.getStreamUptime = getStreamUptime; $.getStreamUptimeSeconds = getStreamUptimeSeconds; $.getViewers = getViewers; $.isOnline = isOnline; $.updateGame = updateGame; $.updateStatus = updateStatus; $.updateCommunity = updateCommunity; $.getFollowAge = getFollowAge; $.getFollowDate = getFollowDate; $.getChannelAge = getChannelAge; $.getStreamDownTime = getStreamDownTime; $.getGamesPlayed = getGamesPlayed; $.getSubscriberCount = getSubscriberCount; })();