diff --git a/src/main.js b/src/main.js index 8b8c5399..d4d84520 100644 --- a/src/main.js +++ b/src/main.js @@ -100,7 +100,7 @@ class FrankerFaceZ extends Module { FrankerFaceZ.Logger = Logger; const VER = FrankerFaceZ.version_info = { - major: 4, minor: 0, revision: 0, extra: '-rc13.4', + major: 4, minor: 0, revision: 0, extra: '-rc13.5', commit: __git_commit__, build: __webpack_hash__, toString: () => diff --git a/src/sites/twitch-twilight/modules/channel_bar.js b/src/sites/twitch-twilight/modules/channel_bar.js index 406fd3b6..fb2d7cda 100644 --- a/src/sites/twitch-twilight/modules/channel_bar.js +++ b/src/sites/twitch-twilight/modules/channel_bar.js @@ -7,7 +7,7 @@ import Module from 'utilities/module'; import { get } from 'utilities/object'; -import CHANNEL_QUERY from './channel_bar_query.gql'; +import CHANNEL_QUERY from './channel_page_query.gql'; export default class ChannelBar extends Module { constructor(...args) { diff --git a/src/sites/twitch-twilight/modules/channel_bar_query.gql b/src/sites/twitch-twilight/modules/channel_header_query.gql similarity index 58% rename from src/sites/twitch-twilight/modules/channel_bar_query.gql rename to src/sites/twitch-twilight/modules/channel_header_query.gql index fd905375..f9b3b47b 100644 --- a/src/sites/twitch-twilight/modules/channel_bar_query.gql +++ b/src/sites/twitch-twilight/modules/channel_header_query.gql @@ -1,4 +1,4 @@ -query { +query ChannelPage_ChannelHeader { user { stream { createdAt diff --git a/src/sites/twitch-twilight/modules/channel_page_query.gql b/src/sites/twitch-twilight/modules/channel_page_query.gql new file mode 100644 index 00000000..444de3b0 --- /dev/null +++ b/src/sites/twitch-twilight/modules/channel_page_query.gql @@ -0,0 +1,14 @@ +fragment channel on User { + stream { + createdAt + } +} + +fragment hostingChannel on User { + hosting { + stream { + createdAt + type + } + } +} \ No newline at end of file diff --git a/src/sites/twitch-twilight/modules/chat/index.js b/src/sites/twitch-twilight/modules/chat/index.js index 4eb9090a..8a85a18a 100644 --- a/src/sites/twitch-twilight/modules/chat/index.js +++ b/src/sites/twitch-twilight/modules/chat/index.js @@ -6,7 +6,7 @@ import {ColorAdjuster} from 'utilities/color'; import {setChildren} from 'utilities/dom'; -import {has, split_chars, shallow_object_equals} from 'utilities/object'; +import {has, make_enum, split_chars, shallow_object_equals} from 'utilities/object'; import {FFZEvent} from 'utilities/events'; import Module from 'utilities/module'; @@ -43,72 +43,67 @@ const REGEX_EMOTES = { }; -const MESSAGE_TYPES = ((e = {}) => { - e[e.Post = 0] = 'Post'; - e[e.Action = 1] = 'Action'; - e[e.PostWithMention = 2] = 'PostWithMention'; - return e; -})(); +const MESSAGE_TYPES = make_enum( + 'Post', + 'Action', + 'PostWithMention' +); +const MOD_TYPES = make_enum( + 'Ban', + 'Timeout', + 'Delete' +); -const MOD_TYPES = ((e = {}) => { - e[e.Ban = 0] = 'Ban'; - e[e.Timeout = 1] = 'Timeout'; - e[e.Delete = 2] = 'Delete'; - return e; -})(); +const AUTOMOD_TYPES = make_enum( + 'MessageRejectedPrompt', + 'CheerMessageRejectedPrompt', + 'MessageRejected', + 'MessageAllowed', + 'MessageDenied', + 'CheerMessageDenied', + 'CheerMessageTimeout', + 'MessageModApproved', + 'MessageModDenied' +); - -const AUTOMOD_TYPES = ((e = {}) => { - e[e.MessageRejectedPrompt = 0] = 'MessageRejectedPrompt'; - e[e.CheerMessageRejectedPrompt = 1] = 'CheerMessageRejectedPrompt'; - e[e.MessageRejected = 2] = 'MessageRejected'; - e[e.MessageAllowed = 3] = 'MessageAllowed'; - e[e.MessageDenied = 4] = 'MessageDenied'; - e[e.CheerMessageDenied = 5] = 'CheerMessageDenied'; - e[e.CheerMessageTimeout = 6] = 'CheerMessageTimeout'; - return e; -})(); - - -const CHAT_TYPES = ((e = {}) => { - e[e.Message = 0] = 'Message'; - e[e.ExtensionMessage = 1] = 'ExtensionMessage'; - e[e.Moderation = 2] = 'Moderation'; - e[e.ModerationAction = 3] = 'ModerationAction'; - e[e.TargetedModerationAction = 4] = 'TargetedModerationAction'; - e[e.AutoMod = 5] = 'AutoMod'; - e[e.SubscriberOnlyMode = 6] = 'SubscriberOnlyMode'; - e[e.FollowerOnlyMode = 7] = 'FollowerOnlyMode'; - e[e.SlowMode = 8] = 'SlowMode'; - e[e.EmoteOnlyMode = 9] = 'EmoteOnlyMode'; - e[e.R9KMode = 10] = 'R9KMode'; - e[e.Connected = 11] = 'Connected'; - e[e.Disconnected = 12] = 'Disconnected'; - e[e.Reconnect = 13] = 'Reconnect'; - e[e.Hosting = 14] = 'Hosting'; - e[e.Unhost = 15] = 'Unhost'; - e[e.Hosted = 16] = 'Hosted'; - e[e.Subscription = 17] = 'Subscription'; - e[e.Resubscription = 18] = 'Resubscription'; - e[e.GiftPaidUpgrade = 19] = 'GiftPaidUpgrade'; - e[e.SubGift = 20] = 'SubGift'; - e[e.Clear = 21] = 'Clear'; - e[e.RoomMods = 22] = 'RoomMods'; - e[e.RoomState = 23] = 'RoomState'; - e[e.Raid = 24] = 'Raid'; - e[e.Unraid = 25] = 'Unraid'; - e[e.Ritual = 26] = 'Ritual'; - e[e.Notice = 27] = 'Notice'; - e[e.Info = 28] = 'Info'; - e[e.BadgesUpdated = 29] = 'BadgesUpdated'; - e[e.Purchase = 30] = 'Purchase'; - e[e.BitsCharity = 31] = 'BitsCharity'; - e[e.CrateGift = 32] = 'CrateGift'; - e[e.RewardGift = 33] = 'RewardGift'; - e[e.SubMysteryGift = 34] = 'SubMysteryGift'; - return e; -})(); +const CHAT_TYPES = make_enum( + 'Message', + 'ExtensionMessage', + 'Moderation', + 'ModerationAction', + 'TargetedModerationAction', + 'AutoMod', + 'SubscriberOnlyMode', + 'FollowerOnlyMode', + 'SlowMode', + 'EmoteOnlyMode', + 'R9KMode', + 'Connected', + 'Disconnected', + 'Reconnect', + 'Hosting', + 'Unhost', + 'Hosted', + 'Subscription', + 'Resubscription', + 'GiftPaidUpgrade', + 'SubGift', + 'Clear', + 'RoomMods', + 'RoomState', + 'Raid', + 'Unraid', + 'Ritual', + 'Notice', + 'Info', + 'BadgesUpdated', + 'Purchase', + 'BitsCharity', + 'CrateGift', + 'RewardGift', + 'SubMysteryGift' +); const NULL_TYPES = [ diff --git a/src/sites/twitch-twilight/modules/legacy_channel_bar.js b/src/sites/twitch-twilight/modules/legacy_channel_bar.js index f48895b2..a27b7104 100644 --- a/src/sites/twitch-twilight/modules/legacy_channel_bar.js +++ b/src/sites/twitch-twilight/modules/legacy_channel_bar.js @@ -7,7 +7,7 @@ import Module from 'utilities/module'; import {get, deep_copy} from 'utilities/object'; -import CHANNEL_QUERY from './channel_bar_query.gql'; +import CHANNEL_QUERY from './channel_header_query.gql'; export default class LegacyChannelBar extends Module { diff --git a/src/utilities/compat/apollo.js b/src/utilities/compat/apollo.js index 3ce1a3d9..8d119b63 100644 --- a/src/utilities/compat/apollo.js +++ b/src/utilities/compat/apollo.js @@ -6,7 +6,7 @@ // ============================================================================ import Module from 'utilities/module'; -import {get, deep_copy} from 'utilities/object'; +import {get} from 'utilities/object'; import merge from 'utilities/graphql'; @@ -213,9 +213,6 @@ export default class Apollo extends Module { query = query_map && query_map.get(id), modifiers = this.modifiers[operation]; - - const pre_modification = deep_copy(request.query); - if ( modifiers ) { for(const mod of modifiers) { if ( typeof mod === 'function' ) @@ -249,8 +246,6 @@ export default class Apollo extends Module { this.log.info('Unable to find GQL Print. Clearing store for query:', operation); this.client.queryManager.queryStore.store[id] = null; } - - this.log.info('Query', operation, pre_modification, request.query, request.variables); } apolloPostFlight(response) { diff --git a/src/utilities/graphql.js b/src/utilities/graphql.js index 08391441..f911d968 100644 --- a/src/utilities/graphql.js +++ b/src/utilities/graphql.js @@ -1,5 +1,3 @@ -import { deep_copy } from "./object"; - 'use strict'; // ============================================================================ @@ -77,11 +75,15 @@ export const MERGE_METHODS = { export function mergeList(a, b) { + let has_operation = false; const a_names = {}; for(const item of a) { if ( ! item || ! item.name || item.name.kind !== 'Name' ) continue; + if ( item.operation ) + has_operation = true; + a_names[item.name.value] = item; } @@ -92,10 +94,20 @@ export function mergeList(a, b) { const name = item.name.value, idx = a_names[name] ? a.indexOf(a_names[name]) : -1; - if ( idx !== -1 ) + if ( idx !== -1 ) { + if ( a[idx].operation && item.operation && a[idx].operation !== item.operation ) + continue; + a[idx] = merge(a[idx], item); - else + if ( a[idx].operation ) + has_operation = true; + + } else { + if ( has_operation && item.operation ) + continue; + a.push(item); + } } return a; diff --git a/src/utilities/object.js b/src/utilities/object.js index 5ed914f4..220181e9 100644 --- a/src/utilities/object.js +++ b/src/utilities/object.js @@ -11,6 +11,18 @@ export function sleep(delay) { return new Promise(s => setTimeout(s, delay)); } +export function make_enum(...array) { + const out = {}; + + for(let i=0; i < array.length; i++) { + const word = array[i]; + out[word] = i; + out[i] = word; + } + + return out; +} + export function timeout(promise, delay) { return new Promise((resolve, reject) => {