diff --git a/Joystream-Role-Bot/.env.sample b/Joystream-Role-Bot/.env.sample deleted file mode 100644 index e375e80..0000000 --- a/Joystream-Role-Bot/.env.sample +++ /dev/null @@ -1,6 +0,0 @@ -SERVER_TOKEN = -SERVER_ID= -VERSION="2.0.2" -QUERY_NODE="https://query.joystream.org/graphql" -RPC_URL="wss://rpc.joystream.org:9944" -SYNCH_TIME = 1 # minutes \ No newline at end of file diff --git a/Joystream-Role-Bot/README.md b/Joystream-Role-Bot/README.md deleted file mode 100644 index f8181ab..0000000 --- a/Joystream-Role-Bot/README.md +++ /dev/null @@ -1,38 +0,0 @@ -### How to use - - -## /who_is - -List member id and on-chain roles of the given discord account -`discord_handle`: the discord Usename of which you wish to display information - -example: /who_is accxyz - -## /list_role_members - -List the discord usernames who have the specified discord role -`discord_role`: The command will display users with this role - -example: /discord_role “Founding Member” - -## /status - -Displays the following information -- on-chain roles that are empty -- what version of bot is running. -- last block where synchronization happened (assuming its poll based as above), current - -## /help - -Link the user to this help page. - -### Setup -In order to start the discord bot server and connect it to the Joystream discord server, the admin must follow the next steps. -- Setup a mongodb server -- Configure the env file. -SERVER_TOKEN = discord server token -VERSION= version number -QUERY_NODE= URL of Joystream QN -RPC_URL= URL of Joystream RPC -SYNCH_TIME = time of synchronization in minutes -- Start the server \ No newline at end of file diff --git a/Joystream-Role-Bot/codegen.yml b/Joystream-Role-Bot/codegen.yml deleted file mode 100644 index f490e45..0000000 --- a/Joystream-Role-Bot/codegen.yml +++ /dev/null @@ -1,45 +0,0 @@ -# Run codegen using: npm run generate -# Make sure schema endpoint is accessible! -schema: - - https://query.joystream.org/graphql # Pioneer - -documents: - - > - fragment MemberFields on Membership { - handle - id - isFoundingMember - isCouncilMember - rootAccount - roles { - status { - ... on WorkerStatusActive { - __typename - } - ... on WorkerStatusLeaving { - __typename - } - ... on WorkerStatusLeft { - __typename - } - ... on WorkerStatusTerminated { - __typename - } - } - groupId - isLead - } - } - - > - query getMembers { - memberships(limit:50000){ - ...MemberFields - } - } - -generates: - ./src/qntypes.ts: - plugins: - - typescript - - typescript-operations - - typescript-graphql-request diff --git a/Joystream-Role-Bot/src/Commands.ts b/Joystream-Role-Bot/src/Commands.ts deleted file mode 100644 index 46cd29e..0000000 --- a/Joystream-Role-Bot/src/Commands.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Command } from "./Command"; -import { Help } from "./commands/Help"; -import { Status } from "./commands/Status"; -import { WhoIs } from "./commands/WhoIs"; -import { ListRoleMembers } from "./commands/ListRoleMembers"; - -export const Commands: Command[] = [Status, Help, WhoIs, ListRoleMembers]; diff --git a/Joystream-Role-Bot/src/RoleBot.ts b/Joystream-Role-Bot/src/RoleBot.ts deleted file mode 100644 index 0e8b083..0000000 --- a/Joystream-Role-Bot/src/RoleBot.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Client, ClientOptions } from "discord.js"; -import ready from "./listeners/ready"; -import interactionCreate from "./listeners/interactionCreate"; -import * as dotenv from "dotenv"; -import { validateEnv } from "./utils/validateEnv"; -import { setMemberRole } from "./controls/control"; - -dotenv.config(); - -const options: ClientOptions = { - intents: [ - "GuildMembers", // Specify the GUILDS intent - "Guilds", - ], -}; - -const token = process.env.SERVER_TOKEN; // add your token here - -console.log("Bot is starting..."); - -(async () => { - if (!validateEnv()) return; - - const client = new Client(options); - - client.login(token); - ready(client); - interactionCreate(client); - setInterval(setMemberRole, Number(process.env.SYNCH_TIME) * 60000, client); -})(); diff --git a/Joystream-Role-Bot/src/RoleConfig.ts b/Joystream-Role-Bot/src/RoleConfig.ts deleted file mode 100644 index 3bf134f..0000000 --- a/Joystream-Role-Bot/src/RoleConfig.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const RoleAddress = { - councilMember: "1131932336922038305", - foundingMember: "1131931118791311372", - creator: "1131931586263261274", - contentWorkingGroup: "1131935012200140840", - contentWorkingGroupLead: "1131932578664943697", - forumWorkingGroup: "1131937985030524950", - forumWorkingGroupLead: "1131937807573721158", - appWorkingGroup: "1131938340686549012", - appWorkingGroupLead: "1131938170813034597", - membershipWorkingGroup: "1131991986044403732", - membershipWorkingGroupLead: "1131992820400529478", - distributionWorkingGroup: "1131936359184089129", - distributionWorkingGroupLead: "1131936100466839643", - storageWorkingGroup: "1131935498076684378", - storageWorkingGroupLead: "1131935298671091824", - operationsWorkingGroupAlpha: "1131936769865162793", - operationsWorkingGroupAlphaLead: "1131936515472240710", - operationsWorkingGroupBeta: "1131937256056311859", - operationsWorkingGroupBetaLead: "1131936978611478560", - operationsWorkingGroupGamma: "1131937635166863441", - operationsWorkingGroupGammaLead: "1131937441658445894", - membershipLinked: "1131937441658445895", -}; diff --git a/Joystream-Role-Bot/src/commands/ListRoleMembers.ts b/Joystream-Role-Bot/src/commands/ListRoleMembers.ts deleted file mode 100644 index b4fd3e0..0000000 --- a/Joystream-Role-Bot/src/commands/ListRoleMembers.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - CommandInteraction, - Client, - ApplicationCommandOptionType, -} from "discord.js"; -import { Command } from "../Command"; - -export const ListRoleMembers: Command = { - name: "list_role_members", - description: "List the discord usernames who have the specified discord role", - options: [ - { - name: "discord_role", - description: "The command will display users with this role", - type: ApplicationCommandOptionType.String, - required: true, - }, - ], - - run: async (client: Client, interaction: CommandInteraction) => { - const { options } = interaction; - - const discordRole = String(options.get("discord_role")?.value); - const roleId = discordRole?.replace(/[<@&!>]/g, ""); - - let content: string = "list role members"; - const guild = client.guilds.cache.get(String(process.env.SERVER_ID)); - - if (!guild) { - content = "Guild not found."; - } else { - const role = guild.roles.cache.find((role) => { - return role.id === roleId; - }); - - if (!role) { - content = `Role <@&${roleId}> not found.`; - } else { - await guild.members.fetch(); - const members = guild.members.cache.filter((member) => - member.roles.cache.has(role.id) - ); - const memberNames = members.map((member) => member.user.id); - if (memberNames.length === 0) { - content = `No members currently have the <@&${roleId}> :shushing_face: `; - } else { - content = `<@&${roleId}>: <@${memberNames.join(">, <@")}>`; - } - } - } - - await interaction.followUp({ - ephemeral: true, - content, - }); - }, -}; diff --git a/Joystream-Role-Bot/src/commands/Status.ts b/Joystream-Role-Bot/src/commands/Status.ts deleted file mode 100644 index 695b3f2..0000000 --- a/Joystream-Role-Bot/src/commands/Status.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CommandInteraction, Client } from "discord.js"; -import { Command } from "../Command"; -import { blockNumber } from "../hook/blockCalc"; -import { qn_recive_data } from "../controls/control"; - -export const Status: Command = { - name: "status", - description: "status", - - run: async (client: Client, interaction: CommandInteraction) => { - let emptyRole: string = "status"; - - const guild = client.guilds.cache.get(String(process.env.SERVER_ID)); - let status: string = ""; - let rpcStatus: string = ""; - - if (!guild) { - emptyRole = "Discord Server not found."; - } else { - await guild.roles.fetch(); - - const roles = guild.roles.cache.filter((role) => role.members.size === 0); - const roleNames = roles.map((role) => role.id); - if (Number(blockNumber) === 0) { - rpcStatus = `Cannot connect to ${process.env.RPC_URL}`; - } else { - rpcStatus = `RPC is Active`; - } - if (!qn_recive_data || qn_recive_data.length === 0) { - status = ` - Cannot connect to ${process.env.QUERY_NODE}`; - } else { - status = " - QN is Active"; - } - - if (roleNames.length === 0) { - emptyRole = `All roles have been filled`; - } else { - emptyRole = `Empty Roles : <@&${roleNames.join(">, <@&")}>`; - } - } - - const content: string = ` - - ${emptyRole}\n - - Status:\n ${status}\n ${rpcStatus} - - Last Updated at Block : ${blockNumber} - - Version :${process.env.VERSION} - `; - - await interaction.followUp({ - content, - ephemeral: true, - }); - }, -}; diff --git a/Joystream-Role-Bot/src/commands/WhoIs.ts b/Joystream-Role-Bot/src/commands/WhoIs.ts deleted file mode 100644 index 73b8d59..0000000 --- a/Joystream-Role-Bot/src/commands/WhoIs.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - CommandInteraction, - Client, - ApplicationCommandOptionType, -} from "discord.js"; -import { Command } from "../Command"; -import { getUserId } from "../controls/control"; - -export const WhoIs: Command = { - name: "who_is", - description: "List member id and on-chain roles of the given discord account", - options: [ - { - name: "discord_handle", - description: - "The discord Username of which you wish to display information", - type: ApplicationCommandOptionType.String, - required: true, - }, - ], - run: async (client: Client, interaction: CommandInteraction) => { - let content: string = `who is`; - const { options } = interaction; - - const discordHandle: string = String(options.get("discord_handle")?.value); - const userId = discordHandle.replace(/[<@!>]/g, ""); - - const guild = client.guilds.cache.get(String(process.env.SERVER_ID)); - - if (!guild) { - content = "Guild not found."; - } else { - await guild.members.fetch(); - const member = guild.members.cache.get(userId); - - if (!member) { - content = `Discord name: Oops, this member does not exist :grimacing: - To create a membership with Pioneer Governance, please go to the app page https://pioneerapp.xyz/#/profile/memberships `; - } else { - const memberId = getUserId(member.user.username); - - if (memberId) { - if (memberId.roles?.length == 0) { - content = `Discord name: <@${userId}> \n - Joystream Member ID: ${memberId.id} \n - On-chain roles: This Member does not have any role on-chain :frowning2: - `; - } else { - content = `Discord name: <@${userId}> \n - Joystream Member ID: ${memberId.id} \n - On-chain roles:<@&${memberId.roles?.join(">, <@&")}>`; - } - } else { - content = `Discord name: <@${userId}> \n - Hey <@${userId}> ! To link your Discord account to your Joystream membership, please go to the Pioneer Governance app and update your membership data https://pioneerapp.xyz/#/profile/memberships \n - `; - } - } - } - - await interaction.followUp({ - ephemeral: true, - content, - }); - }, -}; diff --git a/Joystream-Role-Bot/src/controls/control.ts b/Joystream-Role-Bot/src/controls/control.ts deleted file mode 100644 index e372157..0000000 --- a/Joystream-Role-Bot/src/controls/control.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { Client, CommandInteraction } from "discord.js"; -import { - MemberFieldFragment, - getMembers, -} from "../query/generator/members_generate"; -import { RoleAddress } from "../RoleConfig"; -import { WsProvider } from "@polkadot/rpc-provider"; -import { ApiPromise } from "@polkadot/api"; -import { upDateBlockNumber } from "../hook/blockCalc"; - -export let qn_recive_data: MemberFieldFragment[] = []; - -const provider = new WsProvider(process.env.RPC_URL); - -type RoleMap = { - [key: string]: [string, string]; -}; - -const roleMap: RoleMap = { - contentWorkingGroup: [ - RoleAddress.contentWorkingGroupLead, - RoleAddress.contentWorkingGroup, - ], - forumWorkingGroup: [ - RoleAddress.forumWorkingGroupLead, - RoleAddress.forumWorkingGroup, - ], - appWorkingGroup: [ - RoleAddress.appWorkingGroupLead, - RoleAddress.appWorkingGroup, - ], - membershipWorkingGroup: [ - RoleAddress.membershipWorkingGroupLead, - RoleAddress.membershipWorkingGroup, - ], - distributionWorkingGroup: [ - RoleAddress.distributionWorkingGroupLead, - RoleAddress.distributionWorkingGroup, - ], - storageWorkingGroup: [ - RoleAddress.storageWorkingGroupLead, - RoleAddress.storageWorkingGroup, - ], - operationsWorkingGroupAlpha: [ - RoleAddress.operationsWorkingGroupAlphaLead, - RoleAddress.operationsWorkingGroupAlpha, - ], - operationsWorkingGroupBeta: [ - RoleAddress.operationsWorkingGroupBetaLead, - RoleAddress.operationsWorkingGroupBeta, - ], - operationsWorkingGroupGamma: [ - RoleAddress.operationsWorkingGroupGammaLead, - RoleAddress.operationsWorkingGroupGamma, - ], -}; - -export const setMemberRole = async ( - client: Client, - interaction: CommandInteraction -): Promise => { - const Qndata: MemberFieldFragment[] = await getMembers(); - - const api = await ApiPromise.create({ provider }); - - console.log("Discord server update finish!"); - - if (!api) { - upDateBlockNumber("RPC endpoint disconnected"); - return; - } - - await api?.rpc.chain.subscribeNewHeads((header) => { - upDateBlockNumber(header.number.toString()); - }); - - const guild = client.guilds.cache.get(String(process.env.SERVER_ID)); - if (!guild) { - console.log("Guild not found."); - return; - } - - await guild.members.fetch(); - const members = guild.members.cache.filter((member) => !member.user.bot); - - let buffer: MemberFieldFragment[] = []; - - Qndata.map((qndata) => { - qndata.externalResources - .filter((qndata) => qndata.type === "DISCORD") - .map((exteranldata) => { - members - .filter((member) => member.user.username === exteranldata.value) - .map(() => { - buffer.push(qndata); - }); - }); - }); - - if (!buffer || buffer.length === 0) return; - - qn_recive_data = buffer; - - buffer.map(async (filterqn) => { - // set role to discord server. - const discord_handle = filterqn.externalResources.filter( - (data) => data.type === "DISCORD" - ); - - // remove roles of user - - const member = members - .filter((d) => d.user.username === discord_handle[0].value) - .map(async (member) => { - return member; - }); - - try { - members.forEach(async (member) => { - await member.roles.remove(member.roles.cache); - console.log(`Roles of member ${member.user.tag} have been removed.`); - }); - } catch (error) { - console.error("Error removing member roles:", error); - } - - if (!member) { - return; - } - - (await member[0]).roles.add(RoleAddress.membershipLinked); - - filterqn.roles.map(async (groupID) => { - if (!roleMap[groupID.groupId]) return; - - const [leadAddress, workerAddress] = roleMap[groupID.groupId]; - const address = groupID.isLead ? leadAddress : workerAddress; - const role = await guild.roles.fetch(address); - - if (!role) { - console.log(`<@&${address}> Role not found`); - return; - } - - groupID.status.__typename === "WorkerStatusActive" - ? (await member[0]).roles.add(role) - : (await member[0]).roles.remove(role); - }); - - /// concile, founding, creator part /// - const qnRoleData = [ - { - roleAddress: RoleAddress.foundingMember, - isState: filterqn.isFoundingMember, - }, - { - roleAddress: RoleAddress.councilMember, - isState: filterqn.isCouncilMember, - }, - { - roleAddress: RoleAddress.creator, - isState: false, // update part // ----------? - }, - ]; - - qnRoleData.map(async (qn) => { - const role = await guild.roles.fetch(qn.roleAddress); - if (!role) { - console.log(`<@&${qn.roleAddress}> Role not found`); - return; - } - - qn.isState - ? (await member[0]).roles.add(role) - : (await member[0]).roles.remove(role); - }); - }); -}; - -interface MemberRolesAndId { - id: string; - roles?: string[]; -} - -export const getUserId = (userId: string): MemberRolesAndId | undefined => { - if (!qn_recive_data) return; - - let id: MemberFieldFragment[] = []; - let role: string[] = []; - - qn_recive_data.map((data) => - data.externalResources - .filter((data) => data.type === "DISCORD" && data.value === userId) - .map(() => { - data.roles.map(async (groupID) => { - if (!roleMap[groupID.groupId]) return; - - const [leadAddress, workerAddress] = roleMap[groupID.groupId]; - const address = groupID.isLead ? leadAddress : workerAddress; - - role.push(address); - }); - - if (data.isFoundingMember) role.push(RoleAddress.foundingMember); - if (data.isCouncilMember) role.push(RoleAddress.councilMember); - - id.push(data); - }) - ); - - if (!id || id.length === 0) return; - - return { - id: id[0].id, - roles: role, - }; -}; diff --git a/Joystream-Role-Bot/src/hook/blockCalc.ts b/Joystream-Role-Bot/src/hook/blockCalc.ts deleted file mode 100644 index 3483650..0000000 --- a/Joystream-Role-Bot/src/hook/blockCalc.ts +++ /dev/null @@ -1,5 +0,0 @@ -export let blockNumber: string = "0"; - -export function upDateBlockNumber(data: string) { - blockNumber = data; -} diff --git a/Joystream-Role-Bot/src/listeners/interactionCreate.ts b/Joystream-Role-Bot/src/listeners/interactionCreate.ts deleted file mode 100644 index 453b2ca..0000000 --- a/Joystream-Role-Bot/src/listeners/interactionCreate.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { CommandInteraction, Client, Interaction } from "discord.js"; -import { Commands } from "../Commands"; - -export default (client: Client): void => { - client.on("interactionCreate", async (interaction: Interaction) => { - if (interaction.isCommand() || interaction.isContextMenuCommand()) { - await handleSlashCommand(client, interaction); - } - }); -}; - -const handleSlashCommand = async ( - client: Client, - interaction: CommandInteraction -): Promise => { - const slashCommand = Commands.find((c) => c.name === interaction.commandName); - if (!slashCommand) { - interaction.followUp({ content: "An error has occurred" }); - return; - } - - await interaction.deferReply(); - - slashCommand.run(client, interaction); -}; diff --git a/Joystream-Role-Bot/src/listeners/ready.ts b/Joystream-Role-Bot/src/listeners/ready.ts deleted file mode 100644 index 9918478..0000000 --- a/Joystream-Role-Bot/src/listeners/ready.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Client } from "discord.js"; -import { Commands } from "../Commands"; - -export default (client: Client): void => { - client.on("ready", async () => { - if (!client.user || !client.application) { - return; - } - - await client.application.commands.set(Commands); - - console.log(`${client.user.username} is online`); - }); -}; diff --git a/Joystream-Role-Bot/src/qntypes.ts b/Joystream-Role-Bot/src/qntypes.ts deleted file mode 100644 index ccc19d2..0000000 --- a/Joystream-Role-Bot/src/qntypes.ts +++ /dev/null @@ -1,37342 +0,0 @@ -import { GraphQLClient } from 'graphql-request'; -import { GraphQLClientRequestHeaders } from 'graphql-request/build/cjs/types'; -import gql from 'graphql-tag'; -export type Maybe = T | null; -export type InputMaybe = Maybe; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type MakeEmpty = { [_ in K]?: never }; -export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: { input: string; output: string; } - String: { input: string; output: string; } - Boolean: { input: boolean; output: boolean; } - Int: { input: number; output: number; } - Float: { input: number; output: number; } - BigInt: { input: any; output: any; } - Bytes: { input: any; output: any; } - DateTime: { input: any; output: any; } - JSONObject: { input: any; output: any; } -}; - -export type AmendConstitutionProposalDetails = { - __typename?: 'AmendConstitutionProposalDetails'; - /** New (proposed) constitution text (md-formatted) */ - text: Scalars['String']['output']; -}; - -export type AnnouncingPeriodStartedEvent = BaseGraphQlObject & Event & { - __typename?: 'AnnouncingPeriodStartedEvent'; - createdAt: Scalars['DateTime']['output']; - createdById: Scalars['ID']['output']; - deletedAt?: Maybe; - deletedById?: Maybe; - id: Scalars['ID']['output']; - /** Blocknumber of the block in which the event was emitted. */ - inBlock: Scalars['Int']['output']; - /** Hash of the extrinsic which caused the event to be emitted */ - inExtrinsic?: Maybe; - /** Index of event in block from which it was emitted. */ - indexInBlock: Scalars['Int']['output']; - /** Network the block was produced in */ - network: Network; - /** Filtering options for interface implementers */ - type?: Maybe; - updatedAt?: Maybe; - updatedById?: Maybe; - version: Scalars['Int']['output']; -}; - -export type AnnouncingPeriodStartedEventConnection = { - __typename?: 'AnnouncingPeriodStartedEventConnection'; - edges: Array; - pageInfo: PageInfo; - totalCount: Scalars['Int']['output']; -}; - -export type AnnouncingPeriodStartedEventCreateInput = { - inBlock: Scalars['Float']['input']; - inExtrinsic?: InputMaybe; - indexInBlock: Scalars['Float']['input']; - network: Network; -}; - -export type AnnouncingPeriodStartedEventEdge = { - __typename?: 'AnnouncingPeriodStartedEventEdge'; - cursor: Scalars['String']['output']; - node: AnnouncingPeriodStartedEvent; -}; - -export enum AnnouncingPeriodStartedEventOrderByInput { - CreatedAtAsc = 'createdAt_ASC', - CreatedAtDesc = 'createdAt_DESC', - DeletedAtAsc = 'deletedAt_ASC', - DeletedAtDesc = 'deletedAt_DESC', - InBlockAsc = 'inBlock_ASC', - InBlockDesc = 'inBlock_DESC', - InExtrinsicAsc = 'inExtrinsic_ASC', - InExtrinsicDesc = 'inExtrinsic_DESC', - IndexInBlockAsc = 'indexInBlock_ASC', - IndexInBlockDesc = 'indexInBlock_DESC', - NetworkAsc = 'network_ASC', - NetworkDesc = 'network_DESC', - UpdatedAtAsc = 'updatedAt_ASC', - UpdatedAtDesc = 'updatedAt_DESC' -} - -export type AnnouncingPeriodStartedEventUpdateInput = { - inBlock?: InputMaybe; - inExtrinsic?: InputMaybe; - indexInBlock?: InputMaybe; - network?: InputMaybe; -}; - -export type AnnouncingPeriodStartedEventWhereInput = { - AND?: InputMaybe>; - NOT?: InputMaybe>; - OR?: InputMaybe>; - createdAt_eq?: InputMaybe; - createdAt_gt?: InputMaybe; - createdAt_gte?: InputMaybe; - createdAt_lt?: InputMaybe; - createdAt_lte?: InputMaybe; - createdById_eq?: InputMaybe; - createdById_in?: InputMaybe>; - deletedAt_all?: InputMaybe; - deletedAt_eq?: InputMaybe; - deletedAt_gt?: InputMaybe; - deletedAt_gte?: InputMaybe; - deletedAt_lt?: InputMaybe; - deletedAt_lte?: InputMaybe; - deletedById_eq?: InputMaybe; - deletedById_in?: InputMaybe>; - id_eq?: InputMaybe; - id_in?: InputMaybe>; - inBlock_eq?: InputMaybe; - inBlock_gt?: InputMaybe; - inBlock_gte?: InputMaybe; - inBlock_in?: InputMaybe>; - inBlock_lt?: InputMaybe; - inBlock_lte?: InputMaybe; - inExtrinsic_contains?: InputMaybe; - inExtrinsic_endsWith?: InputMaybe; - inExtrinsic_eq?: InputMaybe; - inExtrinsic_in?: InputMaybe>; - inExtrinsic_startsWith?: InputMaybe; - indexInBlock_eq?: InputMaybe; - indexInBlock_gt?: InputMaybe; - indexInBlock_gte?: InputMaybe; - indexInBlock_in?: InputMaybe>; - indexInBlock_lt?: InputMaybe; - indexInBlock_lte?: InputMaybe; - network_eq?: InputMaybe; - network_in?: InputMaybe>; - updatedAt_eq?: InputMaybe; - updatedAt_gt?: InputMaybe; - updatedAt_gte?: InputMaybe; - updatedAt_lt?: InputMaybe; - updatedAt_lte?: InputMaybe; - updatedById_eq?: InputMaybe; - updatedById_in?: InputMaybe>; -}; - -export type AnnouncingPeriodStartedEventWhereUniqueInput = { - id: Scalars['ID']['input']; -}; - -export type App = BaseGraphQlObject & { - __typename?: 'App'; - appChannels: Array; - appVideos: Array