twitch-js
Version:
Javascript library for the Twitch Messaging Interface.
288 lines • 15.4 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
var parse_1 = require("tekko/dist/parse");
var camelcase_keys_1 = __importDefault(require("camelcase-keys"));
var gt_1 = __importDefault(require("lodash/gt"));
var isEmpty_1 = __importDefault(require("lodash/isEmpty"));
var isFinite_1 = __importDefault(require("lodash/isFinite"));
var toLower_1 = __importDefault(require("lodash/toLower"));
var toNumber_1 = __importDefault(require("lodash/toNumber"));
var toUpper_1 = __importDefault(require("lodash/toUpper"));
var twitch_1 = require("../../../twitch");
var constants = __importStar(require("../../constants"));
var utils = __importStar(require("../"));
var helpers = __importStar(require("./helpers"));
var tagParsers = __importStar(require("./tags"));
exports.base = function (rawMessages, username) {
var rawMessagesV = rawMessages.split(/\r?\n/g);
return rawMessagesV.reduce(function (messages, rawMessage) {
if (!rawMessage.length) {
return messages;
}
var _a = parse_1.parse(rawMessage), command = _a.command, _b = _a.tags, tags = _b === void 0 ? {} : _b, _c = _a.prefix, _d = _c === void 0 ? {
name: undefined,
user: undefined,
host: undefined,
} : _c, name = _d.name, user = _d.user, host = _d.host, _e = _a.params, channel = _e[0], message = _e[1];
var timestamp = String(tags['tmi-sent-ts']) || Date.now().toString();
var messageTags = isEmpty_1.default(tags)
? {}
: camelcase_keys_1.default(tags);
var messageUsername = helpers.username(host, name, user, messageTags.login, messageTags.username, messageTags.displayName);
var baseMessage = {
_raw: rawMessage,
timestamp: helpers.generalTimestamp(timestamp),
command: command,
event: command,
channel: channel !== '*' ? channel : '',
username: messageUsername,
isSelf: typeof messageUsername === 'string' &&
toLower_1.default(username) === messageUsername,
tags: messageTags,
message: message,
};
return __spreadArrays(messages, [baseMessage]);
}, []);
};
/**
* Join a channel.
* @see https://dev.twitch.tv/docs/irc/membership/#join-twitch-membership
*/
exports.joinMessage = function (baseMessage) {
var _a = /:(.+)!(.+)@(.+).tmi.twitch.tv JOIN (#.+)/g.exec(baseMessage._raw), username = _a[1], channel = _a[4];
return __assign(__assign({}, baseMessage), { channel: channel, command: twitch_1.Commands.JOIN, event: twitch_1.Commands.JOIN, username: username });
};
/**
* Join or depart from a channel.
* @see https://dev.twitch.tv/docs/irc/membership/#join-twitch-membership
* @see https://dev.twitch.tv/docs/irc/membership/#part-twitch-membership
*/
exports.partMessage = function (baseMessage) {
var _a = /:(.+)!(.+)@(.+).tmi.twitch.tv PART (#.+)/g.exec(baseMessage._raw), username = _a[1], channel = _a[4];
return __assign(__assign({}, baseMessage), { channel: channel, command: twitch_1.Commands.PART, event: twitch_1.Commands.PART, username: username });
};
/**
* Gain/lose moderator (operator) status in a channel.
* @see https://dev.twitch.tv/docs/irc/membership/#mode-twitch-membership
*/
exports.modeMessage = function (baseMessage) {
var _a = /:[^\s]+ MODE (#[^\s]+) (-|\+)o ([^\s]+)/g.exec(baseMessage._raw), channel = _a[1], mode = _a[2], username = _a[3];
var isModerator = mode === '+';
var baseModeMessage = __assign(__assign({}, baseMessage), { command: twitch_1.Commands.MODE, channel: channel,
username: username });
return isModerator
? __assign(__assign({}, baseModeMessage), { event: twitch_1.ChatEvents.MOD_GAINED, message: "+o", isModerator: true }) : __assign(__assign({}, baseModeMessage), { event: twitch_1.ChatEvents.MOD_LOST, message: '-o', isModerator: false });
};
/**
* List current chatters in a channel.
* @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership
*/
exports.namesMessage = function (baseMessage) {
var _a = /:(.+).tmi.twitch.tv 353 (.+) = (#.+) :(.+)/g.exec(baseMessage._raw), channel = _a[3], names = _a[4];
var namesV = names.split(' ');
return __assign(__assign({}, baseMessage), { channel: channel, command: twitch_1.Commands.NAMES, event: twitch_1.Commands.NAMES, usernames: namesV });
};
/**
* End of list current chatters in a channel.
* @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership
*/
exports.namesEndMessage = function (baseMessage) {
var _a = /:(.+).tmi.twitch.tv 366 (.+) (#.+) :(.+)/g.exec(baseMessage._raw), username = _a[1], channel = _a[3];
return __assign(__assign({}, baseMessage), { channel: channel, command: twitch_1.Commands.NAMES_END, event: twitch_1.Commands.NAMES_END, username: username });
};
/**
* GLOBALUSERSTATE message
*/
exports.globalUserStateMessage = function (baseMessage) {
var tags = baseMessage.tags, other = __rest(baseMessage, ["tags"]);
return __assign(__assign({}, other), { command: twitch_1.Commands.GLOBAL_USER_STATE, event: twitch_1.Commands.GLOBAL_USER_STATE, tags: tagParsers.globalUserState(tags) });
};
/**
* Temporary or permanent ban on a channel.
* @see https://dev.twitch.tv/docs/irc/commands/#clearchat-twitch-commands
*
* All chat is cleared (deleted).
* @see https://dev.twitch.tv/docs/irc/tags/#clearchat-twitch-tags
*/
exports.clearChatMessage = function (baseMessage) {
var tags = baseMessage.tags, username = baseMessage.message, other = __rest(baseMessage, ["tags", "message"]);
if (typeof username !== 'undefined') {
return __assign(__assign({}, other), { tags: __assign(__assign({}, tags), { banReason: helpers.generalString(tags.banReason), banDuration: helpers.generalNumber(tags.banDuration) }), command: twitch_1.Commands.CLEAR_CHAT, event: twitch_1.ChatEvents.USER_BANNED, username: username });
}
return __assign(__assign({}, other), { command: twitch_1.Commands.CLEAR_CHAT, event: twitch_1.Commands.CLEAR_CHAT });
};
/**
* Host starts or stops a message.
* @see https://dev.twitch.tv/docs/irc/commands/#hosttarget-twitch-commands
*/
exports.hostTargetMessage = function (baseMessage) {
var _a = /:tmi.twitch.tv HOSTTARGET (#[^\s]+) :([^\s]+)?\s?(\d+)?/g.exec(baseMessage._raw), channel = _a[1], username = _a[2], numberOfViewers = _a[3];
var isStopped = username === '-';
return __assign(__assign({}, baseMessage), { channel: channel,
username: username, command: twitch_1.Commands.HOST_TARGET, event: isStopped ? twitch_1.ChatEvents.HOST_OFF : twitch_1.ChatEvents.HOST_ON, numberOfViewers: isFinite_1.default(toNumber_1.default(numberOfViewers))
? parseInt(numberOfViewers, 10)
: undefined, message: undefined });
};
/**
* When a user joins a channel or a room setting is changed.
*/
exports.roomStateMessage = function (baseMessage) {
var tags = baseMessage.tags, other = __rest(baseMessage, ["tags"]);
return __assign(__assign({}, other), { command: twitch_1.Commands.ROOM_STATE, event: twitch_1.Commands.ROOM_STATE, tags: tagParsers.roomState(tags) });
};
/**
* NOTICE/ROOM_MODS message
* @see https://dev.twitch.tv/docs/irc/commands/#msg-id-tags-for-the-notice-commands-capability
*/
exports.noticeMessage = function (baseMessage) {
var baseTags = baseMessage.tags, other = __rest(baseMessage, ["tags"]);
var tags = (utils.isAuthenticationFailedMessage(baseMessage)
? __assign(__assign({}, baseTags), { msgId: toLower_1.default(twitch_1.Events.AUTHENTICATION_FAILED) }) : baseTags);
var event = toUpper_1.default(tags.msgId);
switch (tags.msgId) {
case twitch_1.KnownNoticeMessageIds.ROOM_MODS:
return __assign(__assign({}, other), { command: twitch_1.Commands.NOTICE, event: twitch_1.NoticeEvents.ROOM_MODS, tags: tags, mods: helpers.mods(other.message) });
default:
return __assign(__assign({}, other), { command: twitch_1.Commands.NOTICE, event: event,
tags: tags });
}
};
/**
* USERSTATE message
* When a user joins a channel or sends a PRIVMSG to a channel.
*/
exports.userStateMessage = function (baseMessage) {
var tags = baseMessage.tags, other = __rest(baseMessage, ["tags"]);
return __assign(__assign({}, other), { command: twitch_1.Commands.USER_STATE, event: twitch_1.Commands.USER_STATE, tags: tagParsers.userState(tags) });
};
/**
* PRIVMSG message
* When a user joins a channel or sends a PRIVMSG to a channel.
* When a user cheers a channel.
* When a user hosts your channel while connected as broadcaster.
*/
exports.privateMessage = function (baseMessage) {
var _raw = baseMessage._raw, tags = baseMessage.tags;
if (gt_1.default(tags.bits, 0)) {
return __assign(__assign({}, exports.userStateMessage(baseMessage)), { command: twitch_1.Commands.PRIVATE_MESSAGE, event: twitch_1.ChatEvents.CHEER, bits: helpers.generalNumber(tags.bits) });
}
var _a = constants.PRIVATE_MESSAGE_HOSTED_RE.exec(_raw) || [], isHostingPrivateMessage = _a[0], channel = _a[1], displayName = _a[2], isAuto = _a[3], numberOfViewers = _a[4];
if (isHostingPrivateMessage) {
if (isAuto) {
return __assign(__assign({}, baseMessage), { command: twitch_1.Commands.PRIVATE_MESSAGE, event: twitch_1.ChatEvents.HOSTED_AUTO, channel: "#" + channel, tags: { displayName: displayName }, numberOfViewers: helpers.generalNumber(numberOfViewers) });
}
if (numberOfViewers) {
return __assign(__assign({}, baseMessage), { command: twitch_1.Commands.PRIVATE_MESSAGE, event: twitch_1.ChatEvents.HOSTED_WITH_VIEWERS, channel: "#" + channel, tags: { displayName: displayName }, numberOfViewers: helpers.generalNumber(numberOfViewers) });
}
return __assign(__assign({}, baseMessage), { command: twitch_1.Commands.PRIVATE_MESSAGE, event: twitch_1.ChatEvents.HOSTED_WITHOUT_VIEWERS, channel: "#" + channel, tags: { displayName: displayName } });
}
return __assign(__assign({}, exports.userStateMessage(baseMessage)), { command: twitch_1.Commands.PRIVATE_MESSAGE, event: twitch_1.Commands.PRIVATE_MESSAGE });
};
/**
* USERNOTICE message
*/
exports.userNoticeMessage = function (baseMessage) {
var command = twitch_1.Commands.USER_NOTICE;
var tags = __assign(__assign({}, tagParsers.userNotice(baseMessage.tags)), { systemMsg: helpers.generalString(baseMessage.tags.systemMsg) });
var systemMessage = helpers.generalString(baseMessage.tags.systemMsg);
var parameters = tagParsers.userNoticeMessageParameters(tags);
switch (tags.msgId) {
/**
* On anonymous gifted subscription paid upgrade to a channel.
*/
case twitch_1.KnownUserNoticeMessageIds.ANON_GIFT_PAID_UPGRADE:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.ANON_GIFT_PAID_UPGRADE, parameters: parameters,
tags: tags,
systemMessage: systemMessage });
/**
* On gifted subscription paid upgrade to a channel.
*/
case twitch_1.KnownUserNoticeMessageIds.GIFT_PAID_UPGRADE:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.GIFT_PAID_UPGRADE, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* On channel raid.
*/
case twitch_1.KnownUserNoticeMessageIds.RAID:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.RAID, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* On resubscription (subsequent months) to a channel.
*/
case twitch_1.KnownUserNoticeMessageIds.RESUBSCRIPTION:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.RESUBSCRIPTION, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* On channel ritual.
*/
case twitch_1.KnownUserNoticeMessageIds.RITUAL:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.RITUAL, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* On subscription gift to a channel community.
*/
case twitch_1.KnownUserNoticeMessageIds.SUBSCRIPTION_GIFT_COMMUNITY:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.SUBSCRIPTION_GIFT_COMMUNITY, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* On subscription gift to a channel.
*/
case twitch_1.KnownUserNoticeMessageIds.SUBSCRIPTION_GIFT:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.SUBSCRIPTION_GIFT, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* On subscription (first month) to a channel.
*/
case twitch_1.KnownUserNoticeMessageIds.SUBSCRIPTION:
return __assign(__assign({}, baseMessage), { command: command, event: twitch_1.ChatEvents.SUBSCRIPTION, parameters: parameters, tags: tags,
systemMessage: systemMessage });
/**
* Unknown USERNOTICE event.
*/
default:
return __assign(__assign({}, baseMessage), { command: command, event: toUpper_1.default(tags.msgId), tags: tags,
parameters: parameters,
systemMessage: systemMessage });
}
};
exports.default = exports.base;
//# sourceMappingURL=index.js.map