3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-15 05:41:51 +00:00

migrate permissions

Signed-off-by: GitHub <noreply@github.com>
This commit is contained in:
metal 2023-03-11 14:31:59 +00:00 committed by GitHub
parent 8281299369
commit fda9a35f29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 75 additions and 70 deletions

View file

@ -2,7 +2,6 @@ import { ApiPermissions } from "@shared/apiPermissions";
import { getRepository, Repository } from "typeorm";
import { BaseRepository } from "./BaseRepository";
import { ApiPermissionAssignment } from "./entities/ApiPermissionAssignment";
import { Permissions } from "discord.js";
import { ApiAuditLog } from "./ApiAuditLog";
import { AuditLogEventTypes } from "./apiAuditLogTypes";

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, TextChannel } from "discord.js";
import { PermissionsBitField, Snowflake, TextChannel } from "discord.js";
import { GuildPluginData } from "knub";
import moment from "moment-timezone";
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
@ -26,7 +26,9 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
const logs = pluginData.getPlugin(LogsPlugin);
const perms = channel.permissionsFor(pluginData.client.user!.id);
if (!hasDiscordPermissions(perms, Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY)) {
if (
!hasDiscordPermissions(perms, PermissionsBitField.Flags.ViewChannel | PermissionsBitField.Flags.ReadMessageHistory)
) {
logs.logBotAlert({
body: `Missing permissions to read messages or message history in auto-delete channel ${verboseChannelMention(
channel,
@ -35,7 +37,7 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
return;
}
if (!hasDiscordPermissions(perms, Permissions.FLAGS.MANAGE_MESSAGES)) {
if (!hasDiscordPermissions(perms, PermissionsBitField.Flags.ManageMessages)) {
logs.logBotAlert({
body: `Missing permissions to delete messages in auto-delete channel ${verboseChannelMention(channel)}`,
});

View file

@ -1,4 +1,4 @@
import { GuildChannel, Permissions } from "discord.js";
import { GuildChannel, PermissionsBitField } from "discord.js";
import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
import { canUseEmoji, customEmojiRegex, isEmoji } from "../../../utils";
@ -7,7 +7,7 @@ import { missingPermissionError } from "../../../utils/missingPermissionError";
import { readChannelPermissions } from "../../../utils/readChannelPermissions";
import { autoReactionsCmd } from "../types";
const requiredPermissions = readChannelPermissions | Permissions.FLAGS.ADD_REACTIONS;
const requiredPermissions = readChannelPermissions | PermissionsBitField.Flags.AddReactions;
export const NewAutoReactionsCmd = autoReactionsCmd({
trigger: "auto_reactions",

View file

@ -1,4 +1,4 @@
import { GuildChannel, GuildTextBasedChannel, Permissions } from "discord.js";
import { GuildChannel, GuildTextBasedChannel, PermissionsBitField } from "discord.js";
import { LogType } from "../../../data/LogType";
import { isDiscordAPIError } from "../../../utils";
import { getMissingChannelPermissions } from "../../../utils/getMissingChannelPermissions";
@ -8,7 +8,7 @@ import { LogsPlugin } from "../../Logs/LogsPlugin";
import { autoReactionsEvt } from "../types";
import { AutoReaction } from "../../../data/entities/AutoReaction";
const p = Permissions.FLAGS;
const p = PermissionsBitField.Flags;
export const AddReactionsEvt = autoReactionsEvt({
event: "messageCreate",
@ -40,7 +40,7 @@ export const AddReactionsEvt = autoReactionsEvt({
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
if (me) {
const missingPermissions = getMissingChannelPermissions(me, channel, readChannelPermissions | p.ADD_REACTIONS);
const missingPermissions = getMissingChannelPermissions(me, channel, readChannelPermissions | p.AddReactions);
if (missingPermissions) {
const logs = pluginData.getPlugin(LogsPlugin);
logs.logBotAlert({

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake } from "discord.js";
import { PermissionsBitField, Snowflake } from "discord.js";
import * as t from "io-ts";
import { LogType } from "../../../data/LogType";
import { nonNullish, unique } from "../../../utils";
@ -10,7 +10,7 @@ import { LogsPlugin } from "../../Logs/LogsPlugin";
import { ignoreRoleChange } from "../functions/ignoredRoleChanges";
import { automodAction } from "../helpers";
const p = Permissions.FLAGS;
const p = PermissionsBitField.Flags;
export const AddRolesAction = automodAction({
configType: t.array(t.string),
@ -20,7 +20,7 @@ export const AddRolesAction = automodAction({
const members = unique(contexts.map((c) => c.member).filter(nonNullish));
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES);
const missingPermissions = getMissingPermissions(me.permissions, p.ManageRoles);
if (missingPermissions) {
const logs = pluginData.getPlugin(LogsPlugin);
logs.logBotAlert({

View file

@ -1,4 +1,4 @@
import { Permissions, PermissionString } from "discord.js";
import { PermissionsBitField, PermissionsString } from "discord.js";
import * as t from "io-ts";
import { automodAction } from "../helpers";
import { tNullable, isValidSnowflake, tPartialDictionary } from "../../../utils";
@ -14,7 +14,7 @@ export const ChangePermsAction = automodAction({
configType: t.type({
target: t.string,
channel: tNullable(t.string),
perms: tPartialDictionary(t.keyof(Permissions.FLAGS), tNullable(t.boolean)),
perms: tPartialDictionary(t.keyof(PermissionsBitField.Flags), tNullable(t.boolean)),
}),
defaultConfig: {},
@ -52,9 +52,9 @@ export const ChangePermsAction = automodAction({
const channel = pluginData.guild.channels.resolve(channelId);
if (!channel || channel.isThread()) return;
const overwrite = channel.permissionOverwrites.cache.find((pw) => pw.id === target);
const allow = new Permissions(overwrite?.allow ?? 0n).serialize();
const deny = new Permissions(overwrite?.deny ?? 0n).serialize();
const newPerms: Partial<Record<PermissionString, boolean | null>> = {};
const allow = new PermissionsBitField(overwrite?.allow ?? 0n).serialize();
const deny = new PermissionsBitField(overwrite?.deny ?? 0n).serialize();
const newPerms: Partial<Record<PermissionsString, boolean | null>> = {};
for (const key in allow) {
if (typeof actionConfig.perms[key] !== "undefined") {
@ -86,11 +86,11 @@ export const ChangePermsAction = automodAction({
if (!role) return;
const perms = new Permissions(role.permissions).serialize();
const perms = new PermissionsBitField(role.permissions).serialize();
for (const key in actionConfig.perms) {
perms[key] = actionConfig.perms[key];
}
const permsArray = <PermissionString[]>Object.keys(perms).filter((key) => perms[key]);
await role.setPermissions(new Permissions(permsArray)).catch(noop);
const permsArray = <PermissionsString[]>Object.keys(perms).filter((key) => perms[key]);
await role.setPermissions(new PermissionsBitField(permsArray)).catch(noop);
},
});

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake } from "discord.js";
import { PermissionsBitField, Snowflake } from "discord.js";
import * as t from "io-ts";
import { LogType } from "../../../data/LogType";
import { nonNullish, unique } from "../../../utils";
@ -10,7 +10,7 @@ import { LogsPlugin } from "../../Logs/LogsPlugin";
import { ignoreRoleChange } from "../functions/ignoredRoleChanges";
import { automodAction } from "../helpers";
const p = Permissions.FLAGS;
const p = PermissionsBitField.Flags;
export const RemoveRolesAction = automodAction({
configType: t.array(t.string),
@ -21,7 +21,7 @@ export const RemoveRolesAction = automodAction({
const members = unique(contexts.map((c) => c.member).filter(nonNullish));
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES);
const missingPermissions = getMissingPermissions(me.permissions, p.ManageRoles);
if (missingPermissions) {
const logs = pluginData.getPlugin(LogsPlugin);
logs.logBotAlert({

View file

@ -1,4 +1,4 @@
import { MessageOptions, Permissions, Snowflake, TextChannel, ThreadChannel, User } from "discord.js";
import { MessageOptions, PermissionsBitField, Snowflake, TextChannel, ThreadChannel, User } from "discord.js";
import * as t from "io-ts";
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter";
@ -72,7 +72,7 @@ export const ReplyAction = automodAction({
if (
!hasDiscordPermissions(
channel.permissionsFor(pluginData.client.user!.id),
Permissions.FLAGS.SEND_MESSAGES | Permissions.FLAGS.VIEW_CHANNEL,
PermissionsBitField.Flags.SendMessages | PermissionsBitField.Flags.ViewChannel,
)
) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
@ -84,7 +84,10 @@ export const ReplyAction = automodAction({
// If the message is an embed, check for embed permissions
if (
typeof formatted !== "string" &&
!hasDiscordPermissions(channel.permissionsFor(pluginData.client.user!.id), Permissions.FLAGS.EMBED_LINKS)
!hasDiscordPermissions(
channel.permissionsFor(pluginData.client.user!.id),
PermissionsBitField.Flags.EmbedLinks,
)
) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing permissions to reply **with an embed** in ${verboseChannelMention(

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, StageChannel, TextChannel, VoiceChannel } from "discord.js";
import { PermissionsBitField, Snowflake, StageChannel, TextChannel, VoiceChannel } from "discord.js";
import { GuildPluginData } from "knub";
import { LogType } from "../../../data/LogType";
import { isDiscordAPIError, MINUTES } from "../../../utils";
@ -64,7 +64,7 @@ export async function handleCompanionPermissions(
const channel = pluginData.guild.channels.cache.get(channelId as Snowflake);
if (!channel || !(channel instanceof TextChannel)) continue;
pluginData.state.serverLogs.ignoreLog(LogType.CHANNEL_UPDATE, channelId, 3 * 1000);
const fullSerialized = new Permissions(BigInt(permissions)).serialize();
const fullSerialized = new PermissionsBitField(BigInt(permissions)).serialize();
const onlyAllowed = filterObject(fullSerialized, (v) => v === true);
await channel.permissionOverwrites.create(userId, onlyAllowed, {
reason: `Companion Channel for ${voiceChannel!.id} | User Joined`,

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, TextChannel, PermissionString } from "discord.js";
import { Snowflake, TextChannel, PermissionsString, PermissionsBitField } from "discord.js";
import * as t from "io-ts";
import { GuildPluginData } from "knub";
import { ActionError } from "../ActionError";
@ -32,9 +32,9 @@ export async function setChannelPermissionOverridesAction(
}
for (const override of action.overrides) {
const allow = new Permissions(BigInt(override.allow)).serialize();
const deny = new Permissions(BigInt(override.deny)).serialize();
const perms: Partial<Record<PermissionString, boolean | null>> = {};
const allow = new PermissionsBitField(BigInt(override.allow)).serialize();
const deny = new PermissionsBitField(BigInt(override.deny)).serialize();
const perms: Partial<Record<PermissionsString, boolean | null>> = {};
for (const key in allow) {
if (allow[key]) {
perms[key] = true;

View file

@ -1,6 +1,6 @@
import { GuildPluginData } from "knub";
import { InternalPosterPluginType } from "../types";
import { AnyChannel, GuildChannel, MessageManager, NewsChannel, Permissions, TextChannel } from "discord.js";
import { AnyChannel, GuildChannel, MessageManager, NewsChannel, PermissionsBitField, TextChannel } from "discord.js";
import { isDiscordAPIError } from "../../../utils";
type WebhookInfo = [id: string, token: string];
@ -27,7 +27,7 @@ export async function getOrCreateWebhookForChannel(
// Create new webhook
const member = pluginData.client.user && pluginData.guild.members.cache.get(pluginData.client.user.id);
if (!member || member.permissions.has(Permissions.FLAGS.MANAGE_WEBHOOKS)) {
if (!member || member.permissions.has(PermissionsBitField.Flags.ManageWebhooks)) {
try {
const webhook = await channel.createWebhook(`Zephook ${channel.id}`);
await pluginData.state.webhooks.create({

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, TextChannel } from "discord.js";
import { PermissionsBitField, Snowflake, TextChannel } from "discord.js";
import { LogType } from "../../../data/LogType";
import { resolveMember } from "../../../utils";
import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
@ -39,7 +39,7 @@ export const PostAlertOnMemberJoinEvt = modActionsEvt({
const botMember = await resolveMember(pluginData.client, pluginData.guild, pluginData.client.user!.id);
const botPerms = alertChannel.permissionsFor(botMember ?? pluginData.client.user!.id);
if (!hasDiscordPermissions(botPerms, Permissions.FLAGS.SEND_MESSAGES)) {
if (!hasDiscordPermissions(botPerms, PermissionsBitField.Flags.SendMessages)) {
logs.logBotAlert({
body: `Missing "Send Messages" permissions for the \`alert_channel\` configured in \`mod_actions\`: \`${alertChannelId}\``,
});

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake } from "discord.js";
import { PermissionsBitField, Snowflake } from "discord.js";
import { GuildPluginData } from "knub";
import { LogType } from "../../../data/LogType";
import { isDiscordAPIError, isDiscordHTTPError, SECONDS, sleep } from "../../../utils";
@ -12,7 +12,7 @@ export async function isBanned(
timeout: number = 5 * SECONDS,
): Promise<boolean> {
const botMember = pluginData.guild.members.cache.get(pluginData.client.user!.id);
if (botMember && !hasDiscordPermissions(botMember.permissions, Permissions.FLAGS.BAN_MEMBERS)) {
if (botMember && !hasDiscordPermissions(botMember.permissions, PermissionsBitField.Flags.BanMembers)) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing "Ban Members" permission to check for existing bans`,
});

View file

@ -1,4 +1,4 @@
import { GuildMemberEditData, Permissions } from "discord.js";
import { GuildMemberEditData, PermissionsBitField } from "discord.js";
import intersection from "lodash.intersection";
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
import { LogType } from "../../../data/LogType";
@ -9,7 +9,7 @@ import { missingPermissionError } from "../../../utils/missingPermissionError";
import { LogsPlugin } from "../../Logs/LogsPlugin";
import { persistEvt } from "../types";
const p = Permissions.FLAGS;
const p = PermissionsBitField.Flags;
export const LoadDataEvt = persistEvt({
event: "guildMemberAdd",
@ -33,8 +33,8 @@ export const LoadDataEvt = persistEvt({
// Check permissions
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
let requiredPermissions = 0n;
if (config.persist_nicknames) requiredPermissions |= p.MANAGE_NICKNAMES;
if (config.persisted_roles) requiredPermissions |= p.MANAGE_ROLES;
if (config.persist_nicknames) requiredPermissions |= p.ManageNicknames;
if (config.persisted_roles) requiredPermissions |= p.ManageRoles;
const missingPermissions = getMissingPermissions(me.permissions, requiredPermissions);
if (missingPermissions) {
pluginData.getPlugin(LogsPlugin).logBotAlert({

View file

@ -1,4 +1,4 @@
import { ChannelType, GuildTextBasedChannel, Permissions, TextChannel, ThreadChannel, Util } from "discord.js";
import { ChannelType, GuildTextBasedChannel, PermissionsBitField, TextChannel, ThreadChannel, Util } from "discord.js";
import humanizeDuration from "humanize-duration";
import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
@ -88,7 +88,7 @@ export const SlowmodeSetCmd = slowmodeCmd({
if (mode === "native") {
const missingPermissions = getMissingPermissions(
channelPermissions ?? new Permissions(),
channelPermissions ?? new PermissionsBitField(),
NATIVE_SLOWMODE_PERMISSIONS,
);
if (missingPermissions) {
@ -103,7 +103,7 @@ export const SlowmodeSetCmd = slowmodeCmd({
if (mode === "bot") {
const missingPermissions = getMissingPermissions(
channelPermissions ?? new Permissions(),
channelPermissions ?? new PermissionsBitField(),
BOT_SLOWMODE_PERMISSIONS,
);
if (missingPermissions) {

View file

@ -1,8 +1,8 @@
import { Permissions } from "discord.js";
import { PermissionsBitField } from "discord.js";
const p = Permissions.FLAGS;
const p = PermissionsBitField.Flags;
export const NATIVE_SLOWMODE_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_CHANNELS;
export const BOT_SLOWMODE_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_ROLES | p.MANAGE_MESSAGES;
export const BOT_SLOWMODE_CLEAR_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_ROLES;
export const BOT_SLOWMODE_DISABLE_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_ROLES;
export const NATIVE_SLOWMODE_PERMISSIONS = p.ViewChannel | p.ManageChannels;
export const BOT_SLOWMODE_PERMISSIONS = p.ViewChannel | p.ManageRoles | p.ManageMessages;
export const BOT_SLOWMODE_CLEAR_PERMISSIONS = p.ViewChannel | p.ManageRoles;
export const BOT_SLOWMODE_DISABLE_PERMISSIONS = p.ViewChannel | p.ManageRoles;

View file

@ -1,4 +1,4 @@
import { MessageEmbedOptions, Permissions, Role } from "discord.js";
import { MessageEmbedOptions, PermissionsBitField, Role } from "discord.js";
import humanizeDuration from "humanize-duration";
import { GuildPluginData } from "knub";
import moment from "moment-timezone";
@ -36,8 +36,8 @@ export async function getRoleInfoEmbed(
round: true,
});
const rolePerms = role.permissions.has(Permissions.FLAGS.ADMINISTRATOR)
? [PERMISSION_NAMES.ADMINISTRATOR]
const rolePerms = role.permissions.has(PermissionsBitField.Flags.Administrator)
? [PERMISSION_NAMES.Administrator]
: role.permissions.toArray().map((p) => PERMISSION_NAMES[p]);
// -1 because of the @everyone role

View file

@ -4,7 +4,7 @@ import {
MessageActionRow,
MessageButton,
MessageComponentInteraction,
Permissions,
PermissionsBitField,
Snowflake,
TextChannel,
User,
@ -430,7 +430,7 @@ async function performBanSearch(
perPage = SEARCH_RESULTS_PER_PAGE,
): Promise<{ results: User[]; totalResults: number; page: number; lastPage: number; from: number; to: number }> {
const member = pluginData.guild.members.cache.get(pluginData.client.user!.id);
if (member && !hasDiscordPermissions(member.permissions, Permissions.FLAGS.BAN_MEMBERS)) {
if (member && !hasDiscordPermissions(member.permissions, PermissionsBitField.Flags.BanMembers)) {
throw new SearchError(`Unable to search bans: missing "Ban Members" permission`);
}

View file

@ -1,9 +1,9 @@
import { Guild, GuildMember, Permissions, Role, Snowflake } from "discord.js";
import { Guild, GuildMember, PermissionsBitField, Role, Snowflake } from "discord.js";
import { getMissingPermissions } from "./getMissingPermissions";
import { hasDiscordPermissions } from "./hasDiscordPermissions";
export function canAssignRole(guild: Guild, member: GuildMember, roleId: string) {
if (getMissingPermissions(member.permissions, Permissions.FLAGS.MANAGE_ROLES)) {
if (getMissingPermissions(member.permissions, PermissionsBitField.Flags.ManageRoles)) {
return false;
}
@ -18,7 +18,7 @@ export function canAssignRole(guild: Guild, member: GuildMember, roleId: string)
const memberRoles = member.roles.cache;
const highestRoleWithManageRoles = memberRoles.reduce<Role | null>((highest, role) => {
if (!hasDiscordPermissions(role.permissions, Permissions.FLAGS.MANAGE_ROLES)) return highest;
if (!hasDiscordPermissions(role.permissions, PermissionsBitField.Flags.ManageRoles)) return highest;
if (highest == null) return role;
if (role.position > highest.position) return role;
return highest;

View file

@ -1,4 +1,4 @@
import { Permissions } from "discord.js";
import { PermissionsBitField } from "discord.js";
/**
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsFor() or Member#permission
@ -6,13 +6,13 @@ import { Permissions } from "discord.js";
* @return Bitmask of missing permissions
*/
export function getMissingPermissions(
resolvedPermissions: Permissions | Readonly<Permissions>,
resolvedPermissions: PermissionsBitField | Readonly<PermissionsBitField>,
requiredPermissions: number | bigint,
): bigint {
const allowedPermissions = resolvedPermissions;
const nRequiredPermissions = requiredPermissions;
if (Boolean(allowedPermissions.bitfield & Permissions.FLAGS.ADMINISTRATOR)) {
if (Boolean(allowedPermissions.bitfield & PermissionsBitField.Flags.Administrator)) {
return BigInt(0);
}

View file

@ -1,11 +1,11 @@
import { Permissions } from "discord.js";
import { PermissionsBitField } from "discord.js";
const permissionNumberToName: Map<bigint, string> = new Map();
const ignoredPermissionConstants = ["all", "allGuild", "allText", "allVoice"];
for (const key in Permissions.FLAGS) {
for (const key in PermissionsBitField.Flags) {
if (ignoredPermissionConstants.includes(key)) continue;
permissionNumberToName.set(BigInt(Permissions.FLAGS[key]), key);
permissionNumberToName.set(BigInt(PermissionsBitField.Flags[key]), key);
}
/**

View file

@ -1,18 +1,18 @@
import { Permissions, PermissionString } from "discord.js";
import { PermissionsBitField } from "discord.js";
/**
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsOf() or Member#permission
* @param requiredPermissions Bitmask of required permissions
*/
export function hasDiscordPermissions(
resolvedPermissions: Permissions | Readonly<Permissions> | null,
resolvedPermissions: PermissionsBitField | Readonly<PermissionsBitField> | null,
requiredPermissions: number | bigint,
) {
if (resolvedPermissions == null) {
return false;
}
if (resolvedPermissions.has(Permissions.FLAGS.ADMINISTRATOR)) {
if (resolvedPermissions.has(PermissionsBitField.Flags.Administrator)) {
return true;
}

View file

@ -1,9 +1,10 @@
import { Permissions } from "discord.js";
import { PermissionsBitField } from "discord.js";
/**
* Bitmask of permissions required to read messages in a channel
*/
export const readChannelPermissions = Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY;
export const readChannelPermissions =
PermissionsBitField.Flags.ViewChannel | PermissionsBitField.Flags.ReadMessageHistory;
/**
* Bitmask of permissions required to read messages in a channel (bigint)