InstaSynchP ModSpy

Log mod actions into the chat (kick, ban, remove videos, ...)

// ==UserScript==
// @name        InstaSynchP ModSpy
// @namespace   InstaSynchP
// @description Log mod actions into the chat (kick, ban, remove videos, ...)

// @version     1.0.9
// @author      Zod-
// @source      https://github.com/Zod-/InstaSynchP-Modspy
// @license     MIT

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

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

function ModSpy(version) {
  "use strict";
  this.version = version;
  this.name = 'InstaSynchP ModSpy';
  this.filterList = [
    /^Resynch request(?:ed)? ?(?:sent)?\.?\.$/,
    /cleaned the playlist/,
    /^play(?:ing)?$/,
    /Using HTML5 player is not recomended\./,
    /^load start$/,
    /^paused$/,
    /^stalled$/,
    /^activate$/,
    /^Attempt: \d+$/,
    /^XHR TIMEOUT$/
  ];
}

ModSpy.prototype.executeOnce = function () {
  "use strict";
  var th = this,
    oldLog = window.console.log,
    lastRemovedVideo,
    lastMovedVideo,
    lastSkipPercentage,
    actiontaker,
    lastAction,
    bumpCheck;

  window.console.log = function (message) {
    var i,
      filter,
      match;
    //only check for strings
    if (typeof message !== 'string') {
      oldLog.apply(window.console, arguments);
      return;
    }

    //add as error message and then return
    if (message.startsWith("Error:")) {
      addErrorMessage(message);
      oldLog.apply(window.console, arguments);
      return;
    }

    filter = false;
    for (i = 0; i < th.filterList.length; i += 1) {
      if (message.match(th.filterList[i])) {
        filter = true;
        break;
      }
    }
    //return if setting is off or message is filtered
    if (filter) {
      oldLog.apply(window.console, arguments);
      return;
    }
    //prepare the message for each log
    if ((match = message.match(/([^\s]+) moved a video\./))) {
      message = '{0} {1} a <a href="{2}" target="_blank">video</a> via {3}'.format(
        match[1],
        bumpCheck ? 'bumped' : 'moved',
        urlParser.create({
          videoInfo: lastMovedVideo.info
        }),
        lastMovedVideo.addedby
      );
      bumpCheck = false;
    } else if ((match = message.match(/([^\s]+) has banned a user\./))) {
      lastAction = 'banned';
      actiontaker = match[1];
    } else if ((match = message.match(/([^\s]+) has kicked a user\./))) {
      lastAction = 'kicked';
      actiontaker = match[1];
    } else if ((match = message.match(/([^\s]+) removed a video\./))) {
      message = '{0} removed a <a href="{1}" target="_blank">video</a> via {2}.'.format(
        match[1],
        urlParser.create({
          videoInfo: lastRemovedVideo.info
        }),
        lastRemovedVideo.addedby
      );
    } else if ((match = message.match(/([^\s]+) modified the skip ratio\./))) {
      message = '{0} set skip ratio to {1}%'.format(match[1], lastSkipPercentage);
    }

    //add the message to the chat if we don't have to wait for the event to happen
    //user removed events gets fired after the log
    if (!lastAction) {
      addSystemMessage(message);
    }

    oldLog.apply(window.console, arguments);
  };

  events.on(th, 'RemoveUser', function (user) {
    //print the kick/ban log
    if (lastAction && (lastAction === 'banned' || lastAction === 'kicked')) {
      addSystemMessage('{0} has {1} {2}({3})'.format(actiontaker, lastAction, user.username, user.ip));
      lastAction = undefined;
      actiontaker = undefined;
    }
  });

  events.on(th, 'MoveVideo', function (video, position, oldPosition) {
    //save the vidinfo for the log
    lastMovedVideo = video;
    //check if the video got bumped
    if (Math.abs(activeVideoIndex() - position) <= 10 && Math.abs(oldPosition - position) > 10) { // "It's a bump ! " - Amiral Ackbar
      bumpCheck = true;
    }
  });

  events.on(th, 'RemoveVideo', function (video) {
    //save the video for the log
    lastRemovedVideo = video;
  });

  events.on(th, 'Skips', function (ignore1, ignore2, percent) {
    //save the percentage for the log
    lastSkipPercentage = Math.round(percent * 100) / 100;
  });

  events.on(th, 'AddMessage', function (user, message) {
    if (user.username === '' &&
      message.match(/^User (?:kicked|(?:un)?banned)\.?$/)) {
      $('#chat_messages >:last-child').hide()
        .find('.message').toggleClass('text-info');
    }
  });
};

window.plugins = window.plugins || {};
window.plugins.modSpy = new ModSpy('1.0.9');