diff --git a/src/lib/gramjs/tl/api.js b/src/lib/gramjs/tl/api.js index 9d0d96363..0db30cbb6 100644 --- a/src/lib/gramjs/tl/api.js +++ b/src/lib/gramjs/tl/api.js @@ -89,7 +89,7 @@ function mergeWithNamespaces(obj1, obj2) { } function extractParams(fileContent) { - const f = parseTl(fileContent, 109); + const f = parseTl(fileContent); const constructors = []; const functions = []; for (const d of f) { @@ -259,21 +259,15 @@ function createClasses(classesType, params) { if (argsConfig.hasOwnProperty(argName)) { const arg = argsConfig[argName]; if (arg.isFlag) { - const flagValue = arg.flagIndex > 30 - ? args.flags2 & (1 << (arg.flagIndex - 31)) : args.flags & (1 << arg.flagIndex); + const flagGroupSuffix = arg.flagGroup > 1 ? arg.flagGroup : ''; + const flagValue = args[`flags${flagGroupSuffix}`] & (1 << arg.flagIndex); if (arg.type === 'true') { args[argName] = Boolean(flagValue); continue; } - if (flagValue) { - args[argName] = getArgFromReader(reader, arg); - } else { - args[argName] = undefined; - } + + args[argName] = flagValue ? getArgFromReader(reader, arg) : undefined; } else { - if (arg.flagIndicator) { - arg.name = 'flags'; - } args[argName] = getArgFromReader(reader, arg); } } diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index 18812807b..4c5fdc25b 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -79,7 +79,7 @@ chatForbidden#6592a1a7 id:long title:string = Chat; channel#8261ac61 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; chatFull#c9d31138 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions = ChatFull; -channelFull#f2355507 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags.31?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions = ChatFull; +channelFull#f2355507 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; chatParticipantAdmin#a0933f5b user_id:long inviter_id:long date:int = ChatParticipant; diff --git a/src/lib/gramjs/tl/generationHelpers.js b/src/lib/gramjs/tl/generationHelpers.js index 12c8bccc9..5e72ed99b 100644 --- a/src/lib/gramjs/tl/generationHelpers.js +++ b/src/lib/gramjs/tl/generationHelpers.js @@ -110,7 +110,7 @@ const fromLine = (line, isFunction) => { .replace(/(:|\?)bytes /g, '$1string ') .replace(/|{|}/g, '') - .replace(/ \w+:flags\.\d+\?true/g, ''); + .replace(/ \w+:flags\d*\.\d+\?true/g, ''); if (currentConfig.name === 'inputMediaInvoice') { // eslint-disable-next-line no-empty @@ -147,6 +147,7 @@ function buildArgConfig(name, argType) { isVector: false, isFlag: false, skipConstructorId: false, + flagGroup: 0, flagIndex: -1, flagIndicator: true, type: undefined, @@ -159,17 +160,18 @@ function buildArgConfig(name, argType) { // Strip the exclamation mark always to have only the name currentConfig.type = argType.replace(/^!+/, ''); - // The type may be a flag (flags.IDX?REAL_TYPE) + // The type may be a flag (flags[N].IDX?REAL_TYPE) // Note that 'flags' is NOT the flags name; this // is determined by a previous argument - // However, we assume that the argument will always be called 'flags' - const flagMatch = currentConfig.type.match(/flags.(\d+)\?([\w<>.]+)/); + // However, we assume that the argument will always be called 'flags[N]' + const flagMatch = currentConfig.type.match(/flags(\d*)\.(\d+)\?([\w<>.]+)/); if (flagMatch) { currentConfig.isFlag = true; - currentConfig.flagIndex = Number(flagMatch[1]); + currentConfig.flagGroup = Number(flagMatch[1] || 1); + currentConfig.flagIndex = Number(flagMatch[2]); // Update the type to match the exact type, not the "flagged" one - [, , currentConfig.type] = flagMatch; + [, , , currentConfig.type] = flagMatch; } // Then check if the type is a Vector @@ -210,7 +212,7 @@ function buildArgConfig(name, argType) { return currentConfig; } -function* parseTl(content, layer, methods = [], ignoreIds = CORE_TYPES) { +function* parseTl(content, methods = [], ignoreIds = CORE_TYPES) { (methods || []).reduce((o, m) => ({ ...o, [m.name]: m, diff --git a/src/lib/gramjs/tl/static/api.tl b/src/lib/gramjs/tl/static/api.tl index 90de76067..78bcb5080 100644 --- a/src/lib/gramjs/tl/static/api.tl +++ b/src/lib/gramjs/tl/static/api.tl @@ -99,7 +99,7 @@ channel#8261ac61 flags:# creator:flags.0?true left:flags.2?true broadcast:flags. channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; chatFull#c9d31138 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions = ChatFull; -channelFull#f2355507 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags.31?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions = ChatFull; +channelFull#f2355507 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; diff --git a/src/lib/gramjs/tl/types-generator/generate.js b/src/lib/gramjs/tl/types-generator/generate.js index 390fe1a1e..b94247cea 100644 --- a/src/lib/gramjs/tl/types-generator/generate.js +++ b/src/lib/gramjs/tl/types-generator/generate.js @@ -27,7 +27,7 @@ function main() { } function extractParams(fileContent) { - const defInterator = parseTl(fileContent, 109); + const defInterator = parseTl(fileContent); const types = {}; const constructors = []; const functions = []; diff --git a/src/lib/gramjs/tl/types-generator/template.js b/src/lib/gramjs/tl/types-generator/template.js index 7c6453705..8cb8bb7e1 100644 --- a/src/lib/gramjs/tl/types-generator/template.js +++ b/src/lib/gramjs/tl/types-generator/template.js @@ -1,6 +1,7 @@ // Not sure what they are for. const RAW_TYPES = new Set(['Bool', 'X']) -const FLAGS = ['flags', 'flags2']; + +const FLAG_REGEX = /flags\d*/; module.exports = ({ types, constructors, functions }) => { function groupByKey(collection, key) { @@ -17,6 +18,10 @@ module.exports = ({ types, constructors, functions }) => { }, {}) } + function isFlagArg(argName) { + return argName.match(FLAG_REGEX); + } + function renderTypes(types, indent) { return types.map(({ name, constructors }) => ` ${!constructors.length ? '// ' : ''}export type Type${upperFirst(name)} = ${constructors.map((name) => name) @@ -33,7 +38,7 @@ module.exports = ({ types, constructors, functions }) => { return `export class ${upperFirst(name)} extends VirtualClass {};` } - let hasRequiredArgs = argKeys.some((argName) => !FLAGS.includes(argName) && !argsConfig[argName].isFlag) + let hasRequiredArgs = argKeys.some((argName) => !isFlagArg(argName) && !argsConfig[argName].isFlag) return ` export class ${upperFirst(name)} extends VirtualClass<{ @@ -62,7 +67,7 @@ ${indent}};`.trim() return `export class ${upperFirst(name)} extends Request {};` } - let hasRequiredArgs = argKeys.some((argName) => !FLAGS.includes(argName) && !argsConfig[argName].isFlag) + let hasRequiredArgs = argKeys.some((argName) => !isFlagArg(argName) && !argsConfig[argName].isFlag) return ` export class ${upperFirst(name)} extends Request