как узнать количество сообщений в дискорде
Как загрузить и посмотреть историю канала и сообщений в Discord?
Ищите способ загрузки копии всего группового канала Discord, чтобы посмотреть историю сообщений? Узнаем подробно, как это сделать в различных форматах, включая в легко открываемых HTML и текстовых файлах.
Если уже используете Discord, скорее всего, присоединились к нескольким группам и участвовали в бесчисленных разговорах. Большинство из них, возможно, не стоит просматривать и создавать резервные копии. Однако, если также используете Discord для более значимых диалогов, и история не просто усеяна одноразовыми переписками об игровом контенте, есть вероятность, что захотите загрузить и посмотреть эти стенограммы.
Поскольку Discord официально не предлагает способа загрузки / экспорта записи чатов или истории сообщений, нужно использовать сторонние инструменты. Можете скептически относится к тому, как работают эти решения, но есть один исключительный способ, который делает загрузку истории сообщений Discord достаточно простым.
Как получить запись чатов канала и сообщений из Discord?
Чтобы начать загрузку (экспорт) чата из канала и истории сообщений, перейдите на страницу GitHub и скачайте Discord Chat Exporter. Для этого сделайте запрос в интернете по имени этого приложения и после отображения результатов поиска перейдите на сайт, указанный на рисунке.
Перейдите на вкладку Releases и загрузите последнюю версию DiscordChatExporter.
Приложению будет загружено в zip-архиве. Распакуйте его в выбранное место и запустите файл DiscordChatExporter.exe. Теперь следуйте указанной инструкции.
Откройте Discord и войдите в свою учетную запись. Затем нажмите Ctrl + Shift + I, чтобы открыть меню разработчика (Developer Options). Нажмите на вкладку Application в верхней части страницы. Возможно, придется развернуть опцию с помощью стрелки, если она скрыта.
Выберите опцию Local Storage — https://discordapp.com на левой панели. Теперь нажмите Ctrl + R, чтобы обновить страницу. Это позволит отобразить опцию токена, которая не видна при первом доступе к расположению.
Если пытаетесь найти токен и он невидим, обновите страницу и щелкните на кнопку стоп, когда появится код токена. Это заблокирует код, позволяя его скопировать.
Теперь просто скопируйте и вставьте этот код в верхнюю часть DiscordChatExporter без кавычек, нажмите стрелку, и вся информация Discord будет загружена.
Чтобы скачать историю, все, что нужно сделать, это выбрать группу Discord, из которой хотите экспортировать чат или сообщения, затем укажите канал в средней панели.
Как только щелкните на канал, увидите окно с параметрами экспорта. Настройте их в соответствии со своими предпочтениями. Выберите Browse, чтобы указать место для загрузки файла, затем Export для извлечения данных.
Удобным форматом для экспорта истории сообщений является HTML. Поскольку его можно легко посмотреть в текстовом формате, аналогичном исходному макету Discord. Включает в себя значки пользователей, смайлики, эмодзи и ссылки.
Как Discord хранит миллиарды сообщений
Discord продолжает расти быстрее, чем мы ожидали, как и пользовательский контент. Чем больше пользователей — тем больше сообщений в чате. В июле мы объявили о 40 млн сообщений в день, в декабре объявили о 100 млн, а в середине января преодолели 120 млн. Мы сразу решили хранить историю чатов вечно, так что пользователи могут вернуться в любой момент и получить доступ к своим данным с любого устройства. Это много данных, поток и объём которых нарастает, и все они должны быть доступными. Как мы это делаем? Cassandra!
Что мы делали
Изначальную версию Discord написали быстрее чем за два месяца в начале 2015 года. Возможно, одной из лучших СУБД для быстрого выполнения итераций является MongoDB. Всё в Discord специально хранилось в едином реплисете (replica set) MongoDB, но мы также готовили всё для простой миграции в новую СУБД (мы знали, что не собираемся использовать шардинг MongoDB из-за его сложности и неизвестной стабильности). На самом деле это часть нашей корпоративной культуры: разрабатывай быстро, чтобы испытать новую функцию продукта, но всегда с курсом на более надёжное решение.
Выбор правильной СУБД
Перед выбором новой СУБД нам требовалось понять имеющиеся шаблоны чтения/записи и почему возникли проблемы с текущим решением.
Сделав выбор, нужно было доказать, что он действительно оправдан.
Моделирование данных
Лучший способ описать новичку Cassandra — это аббревиатура KKV. Две буквы “K” содержат в себе первичный ключ. Первая “K” — это ключ раздела. Он помогает определить, в какой ноде живут данные и где их найти на диске. Внутри раздела множество строк, и конкретную строку внутри раздела определяет вторая “K” — ключ кластеризации. Он работает как первичный ключ внутри раздела и определяет способ сортировки строк. Можете представить раздел как упорядоченный словарь. Все эти качества вместе взятые позволяют очень мощное моделирование данных.
Вот упрощённая схема для нашей таблицы сообщений (она пропускает примерно 10 колонок).
Хотя схемы у Cassandra и похожи на схемы реляционных БД, их легко изменять, что не оказывает какого-либо временного влияния на производительность. Мы взяли лучшее от хранилища блобов и реляционного хранилища.
Как только начался импорт существующих сообщений в Cassandra, мы сразу увидели в логах предупреждения, что найдены разделы размером более 100 МБ. Да ну?! Ведь Cassandra заявляет о поддержке разделов 2 ГБ! По всей видимости, сама возможность не означает, что так нужно делать. Большие разделы накладывают сильную нагрузку на сборщик мусора в Cassandra при уплотнении, расширении кластера и т.д. Наличие большого раздела также означает, что данные в нём нельзя распределить по кластеру. Стало ясно, что нам придётся как-то ограничить размеры разделов, потому что некоторые каналы Discord могут существовать годами и постоянно увеличиваться в размере.
Мы решили распределить наши сообщения блоками (buckets) по времени. Мы посмотрели на самые большие каналы в Discord и определили, что если хранить сообщения блоками примерно по 10 дней, то комфортно вложимся в лимит 100 МБ. Блоки нужно получать из message_id или метки времени.
Для запроса недавних сообщений в канале мы сгенерировали диапазон блоков от текущего времени до channel_id (он тоже хронологически сортируется как Snowflake и должен быть старше, чем первое сообщение). Затем мы последовательно опрашиваем разделы до тех пор, пока не соберём достаточно сообщений. Обратная сторона такого метода в том, что изредка активным инстансам Discord придётся опрашивать много разных блоков, чтобы собрать достаточно сообщений со временем. На практике оказалось, что всё в порядке, потому что для активного инстанса Discord обычно находится достаточно сообщений в первом разделе, и таких большинство.
Импорт сообщений в Cassandra прошёл без помех, и мы были готовы опробовать её в производстве.
Тяжёлый запуск
Выводить новую систему в производство всегда страшно, так что хорошей идеей будет проверить её, не затрагивая пользователей. Мы настроили систему на дублирование операций чтения/записи в MongoDB и Cassandra.
Немедленно после запуска в баг-трекере появились ошибки, что author_id равен нулю. Как он может быть нулевым? Это обязательное поле!
Согласованность в конечном счёте
Cassandra — система типа AP, то есть гарантированная целостность здесь приносится в жертву доступности, что мы и хотели, в общем. В Cassandra противопоказано чтение перед записью (операции чтения более дорогие) и поэтому всё, что делает Cassandra, — это обновление и вставку (upsert), даже если предоставить только определённые колонки. Вы также можете писать в любую ноду, и она автоматически разрешит конфликты, используя семантику «последняя запись выигрывает» по каждой колонке. Так как это нас коснулось?
Пример состояния гонки редактирование/удаление
В случае, если пользователь редактировал сообщение, в то время как другой пользователь удалял то же самое сообщение, у нас появлялась строка с полностью отсутствующими данными, за исключением первичного ключа и текста, потому что Cassandra записывает только обновления и вставки. Для этой проблемы есть два возможных решения:
Решая эту проблему, мы заметили, что были весьма неэффективны с операциями записи. Поскольку Cassandra согласована в конечном счёте, то она не может вот так взять и немедленно удалить данные. Ей нужно реплицировать удаления на другие ноды, и это следует сделать даже если ноды временно недоступны. Cassandra справляется с этим, приравнивая удаление к своеобразной форме записи под названием “tombstone” («надгробие»). Во время операции чтения она просто проскакивает через «надгробия», которые встречаются по пути. Время жизни «надгробий» настраивается (по умолчанию, 10 дней), и они навсегда удаляются во время уплотнения базы, если срок вышел.
Удаление колонки и запись нуля в колонку — это абсолютно одно и то же. В обоих случаях создаётся «надгробие». Поскольку все записи в Cassandra являются обновлениями и вставками, то вы создаёте «надгробие» даже если изначально записываете нуль. На практике, наша полная схема сообщения состояла из 16 колонок, но среднее сообщение имело только 4 установленных значения. Мы записывали 12 «надгробий» в Cassandra, обычно без всякой причины. Решение проблемы было простым: записывать в базу только ненулевые значения.
Производительность
Известно, что Cassandra быстрее выполняет операции записи, чем чтения, и мы наблюдали в точности это. Операции записи происходили в интервале менее миллисекунды, а операции чтения — менее 5 миллисекунд. Такие показатели наблюдались независимо от типа данных, к которым осуществлялся доступ. Производительность сохранялась неизменной в течение недели тестирования. Ничего удивительного, мы получили в точности то, чего ожидали.
Задержка чтения/записи, по данным из лога
В соответствии с быстрой, надёжной производительностью чтения, вот пример перехода к сообщению годичной давности в канале с миллионами сообщений:
Большой сюрприз
Всё прошло гладко, так что мы выкатили Cassandra как нашу основную базу данных и вывели из строя MongoDB в течение недели. Она продолжала безукоризненно работать… примерно 6 месяцев, пока однажды не перестала реагировать.
Мы заметили, что Cassandra непрерывно останавливается на 10 секунд во время сборки мусора, но совершенно не могли понять, почему. Начали копать — и нашли канал Discord, который требовал 20 секунд для загрузки. Виновником был публичный Discord-сервер подреддита Puzzles & Dragons. Поскольку он публичный, мы присоединились посмотреть. К нашему удивлению, на канале было только одно сообщение. В тот момент стало очевидно, что они удалили миллионы сообщений через наши API, оставив только одно сообщение на канале.
Если вы внимательно читали, то помните, как Cassandra обрабатывает удаления при помощи «надгробий» (упомянуто в главе «Согласованность в конечном счёте»). Когда пользователь загружает этот канал, хоть там одно сообщение, Cassandra приходится эффективно сканировать миллионы «надгробий» сообщений. Тогда она генерирует мусор быстрее, чем JVM может собрать его.
Мы решили эту проблему следующим образом:
Будущее
В данный момент у нас работает кластер из 12 нодов с коэффициентом репликации 3, и мы продолжим добавлять новые ноды Cassandra по мере надобности. Мы верим, что этот подход работоспособен в долговременной перспективе, но по мере роста Discord просматривается отдалённое будущее, когда придётся сохранять миллиарды сообщений в день. У Netflix и Apple работают кластеры с сотнями нодов, поэтому пока что нам не о чем волноваться. Однако хочется иметь пару идей про запас.
Ближайшее будущее
Отдалённое будущее
Заключение
Прошло уже больше года с момента перехода на Cassandra, и несмотря на «большой сюрприз», это было спокойное плавание. Мы вышли с более 100 миллионов общего количества сообщений на более чем 120 миллионов сообщений в день, сохранив производительность и стабильность.
Благодаря успеху этого проекта, с тех пор мы перенесли все остальные наши данные в производстве на Cassandra, и тоже успешно.
В продолжении этой статьи мы исследуем, как мы осуществляем полнотекстовый поиск по миллиардам сообщений.
У нас до сих пор нет специализированных инженеров DevOps (только четыре инженера бэкенда), так что очень классно иметь систему, о которой не приходится волноваться. Мы набираем сотрудников, так что обращайтесь, если подобные задачки щекочут ваше воображение.
Полный гайд по командам Discord
Любой, кто находится в сети, знаком с Discord. Он бесплатный и простой в использовании, что позволяет вам создавать социальную онлайн-среду без необходимости знать что-либо, кроме имен пользователей вашего компаньона.
В результате с момента своего первого запуска в мае 2015 года Discord стал коммуникационной платформой для всех, от геймеров до компаний. Программа поддерживает голосовые каналы и видеозвонки, а также обмен мгновенными сообщениями, а также поддержку групповых «серверов». Но чтобы сделать процесс еще более плавным, Discord предлагает полный набор команд для добавления функций, модерации или новизны.
Команды так же просты в использовании, как и сама программа: просто введите правильный код в окно чата сервера, добавьте любой необходимый префикс – и готово!
Список команд в чате Discord
Основные команды чата Discord не очень продуманы, но они должны помочь вам немного улучшить работу с Discord. Они не требуют использования бота, и если вы хотите увидеть полный список, введите ‘/’ в чат сервера. Оттуда просто нажмите на тот, который вам нужен!
/giphy [текст] – ищет на сайте Giphy анимированный GIF.
/me [text] – «Отображает текст с выделением».
/nick – «Меняет ник на этом сервере».
/shrug – Вставляет этот фрагмент ASCII-арта «¯ \ _ (ツ) _ / ¯» в канал.
/spoiler [text] – «Помечает ваше сообщение как спойлер».
/tableflip – Вставляет этот фрагмент ASCII-арта «(╯ ° □ °) ╯︵ ┻━┻» в канал.
/unflip – Вставляет этот фрагмент ASCII-арта «┬─┬ ノ (゜ – ゜ ノ)» в канал.
/tenor [текст] – ищет на сайте Tenor анимированный GIF.
/tts [text] – «Воспользуйтесь преобразованием текста в речь для чтения сообщения».
Команды модерации и поиска MEE6 Bot
MEE6 – популярный робот-модератор чата Discord. Для многих пользователей, которые присоединятся к своему первому серверу Discord или голосовому чату, MEE6 станет первым дружелюбным лицом, с которым они столкнутся.
MEE6 имеет всевозможные функции, позволяя пользователям использовать MEE6 как для модерации, так и для поиска. Команды модерации дают администраторам серверов возможность поддерживать закон и порядок в своих различных каналах. Команды поиска предписывают MEE6 сканировать различные базы данных в поисках записей, изображений, видео и информации.
Кроме того, панель управления MEE6 позволяет пользователям программировать свои собственные команды для ботов.
Команды модерации бота MEE6
MEE6 предлагает набор основных команд модерации чата:
!tempban [участник] [продолжительность] [необязательная причина] – используется для изгнания одного участника с сервера Discord на ограниченный период времени.
!mute [участник] [необязательная причина] – Используется для отключения звука участника, чтобы он не мог участвовать в различных каналах.
!tempmute [участник] [продолжительность] [необязательная причина] – используется для отключения звука участника, чтобы он не мог участвовать в различных каналах в течение ограниченного периода времени.
!unmute [member] – используется для отмены команды отключения звука.
!clear [необязательный член] [необязательный счетчик] – используется для очистки вкладов в определенном канале.
!infractions [member] – Используется, чтобы показать, сколько нарушений имеет конкретный участник против них.
! kick [участник] [необязательная причина] – Используется для удаления пользователя с сервера. Более-менее похоже на бан, но они смогут присоединиться позже.
! slowmode [необязательный тайм-аут] [необязательно выключен] – Используется для включения или выключения медленного режима на определенном канале.
!warn [участник] [необязательная причина] – Используется для предупреждения пользователя о том, что он нарушает правила и вызывает нарушение.
Команды поиска ботов MEE6
Мало того, MEE6 предлагает набор потрясающих команд поиска, позволяющих извлекать информацию обо всем, от покемонов до стримеров Twitch, или вставлять видео и изображения YouTube. Вот полный список команд.
!anime [поисковый запрос] – Используется для поиска аниме на Kitsu.
!imgur [поисковый запрос] – Используется для поиска мемов на Imgur.
!manga [поисковый запрос] – Используется для поиска манги на Kitsu.
!pokemon [поисковый запрос ] – Используется для поиска покемонов в Pokeapi Pokedex.
!twitch [поисковый запрос] – Используется для поиска канала на Twitch.
!urban [поисковый запрос] – используется для поиска сленговых словечек в Городском словаре.
!youtube [поисковый запрос] – используется для поиска видео на YouTube.
Программирование пользовательских команд MEE6
Программировать собственные команды MEE6 поразительно просто. Он не требует знания Python или синтаксиса и встроен в вашу панель управления MEE6. Но на всякий случай, если вы никогда не делали этого раньше, я здесь, чтобы дать вам быстрый урок
Команды модерации и новизны Dyno Bot в Discord
Если MEE6 – самый любимый модератор чата в Discord, то Dyno вероятно самый полезный из них. Это, наверное, и самое интересное.
Dyno предлагает команды модерации, аналогичные Dyno, но с большей и более сложной базой данных функций. Тем не менее, где Dyno действительно сияет, так это в новинках. Поверь мне, тебе очень захочется их похвастаться.
Команды модерации Dyno Bot
Бот Dyno Discord предлагает самый полный набор команд модерации на платформе, позволяющий вам контролировать каналы вашего сервера – даже с самыми коварными рапскальонами.
?announce every [канал] [сообщение] – используется для отправки объявления @everyone в определенном канале Discord.
?modlogs [пользователь] – используется для получения списка журналов модератора для указанного пользователя.
?note [пользователь] [текст] – используется для создания заметки о конкретном пользователе.
?notes [пользователь] – используется для просмотра заметок, созданных о конкретном пользователе.
?clearnotes [пользователь] – используется для удаления всех заметок, созданных о конкретном пользователе.
?warn [пользователь] [причина] – используется, чтобы предупредить участника о том, что его поведение может нарушить правила сервера.
?warnings [пользователь] – используется для просмотра предупреждений, полученных указанным участником. Он сообщит вам, имеете ли вы дело с преступником, совершившим впервые, или с опытным преступником.
?mute [пользователь] [ограничение] [причина] – используется, чтобы запретить пользователю участвовать в различных каналах сервера.
?unmute [пользователь] [причина] – используется для повторного разрешения пользователю участвовать в различных каналах сервера.
?deafen [user] – оглушение – это в основном противоположность отключения звука, используемого для прекращения получения пользователями новых сообщений.
?undeafen [пользователь] – используется для снятия защиты с пользователя.
?kick [пользователь] [причина] – используется для удаления пользователя с сервера.
?lock [канал] 09:13:52 PM [сообщение] – используется для блокировки канала с дополнительным ограничением времени и пояснительным сообщением.
?unlock [канал] [сообщение] – используется для отмены блокировки канала.
?softban [пользователь] [причина] – используется для блокировки (с последующим мгновенным разблокированием) для удаления сообщения пользователя.
?ban [пользователь] [лимит] [причина] – Используется для блокировки участника сервера, возможность ограничения на определенный период.
?unban [пользователь или идентификатор] [причина] – используется для разблокировки участника сервера.
?addmod [роль ] – Добавить пользователя в роль модератора.
?members [роль] – используется для перечисления до 90 участников с указанной ролью.
?clean [необязательный номер] – используется для очистки ответов Dyno для вашего сервера.
Команды Dyno Bot для новинок
Однако бот Dyno Discord помогает не только модерировать ваш сервер. Dyno – это тоже очень весело! Вот полный список новых команд Dyno:
?cat – генерирует случайное изображение очаровательной кошки из Интернета, которое Dyno немедленно публикует на канале.
?country [код страны] – используется для получения статистики по конкретной стране, включая население, столицу и валюту.
?dadjoke – используется для извлечения случайной отцовской шутки, которая автоматически публикуется в канале. Гарантированно будет настолько же увлекательным, насколько и несмешным!
?dog – генерирует случайное изображение очаровательной собаки из Интернета, которое Dyno немедленно публикует на канале.
?flip – Используется для подбрасывания монеты между орлом и решкой.
?github [имя репозитория] – используется для генерации информации о конкретном репозитории Github.
?itunes [название песни] – используется для получения основной информации о песне, включая имя исполнителя и альбом, из которого она принадлежит.
?norris – используется для генерации случайного факта о Чаке Норрисе. 100% правда в стиле техасских рейнджеров.
?pokemon [имя] – используется для получения основной информации о покемоне, включая способности, тип, вес и рост.
?poll «[сообщение]» «[выбор1]» «[выбор2]» – используется для создания опроса на канале, в котором могут голосовать другие пользователи.
?pug – Создает случайное очаровательное изображение мопса из Интернета, которое Dyno немедленно публикует на канале.
?roll [размер кубика, количество сторон или количество кубиков] – используется для броска кубика или количества кубиков в канале.
?rps [выбор] – Используется для игры в камень-ножницы-бумага с ботом Dyno.
?space – используется для получения информации о Международной космической станции.
Разные команды Dyno Bot
Но это еще не все. Бот Dyno также предлагает ряд других команд, столь же простых, сколь и случайных:
?afk – используется для установки статуса «вне клавиатуры», который может отображаться всякий раз, когда упоминается ваше имя.
?afk set [status] – Используется для отображения статуса «вне клавиатуры», который также может отображаться в вашем нике.
?afk ignore [канал] – Используется, чтобы не возвращаться из вашего статуса «вне клавиатуры» при разговоре по каналу.
?avatar [пользователь] – используется для создания увеличенной версии изображения аватара пользователя в чате. Хотите знать, как кто-то действительно выглядит? Это команда для вас!
?color [шестнадцатеричное число] – используется для поиска информации о конкретном шестнадцатеричном числе цвета.
?dynoav – Используется для немедленного создания аватара, похожего на Dynoav.
?randomcolor – Генератор случайного шестнадцатеричного цвета, который ваши коллеги-покровители могут наблюдать в канале.
?remindme 09:13:52 PM [остаток] – Создает напоминание в определенном канале.
?whois [упоминание пользователя] – извлекает информацию о конкретном пользователе на сервере, в том числе о том, как долго он был участником, когда была создана его учетная запись и есть ли у него какие-либо роли на сервере.
?distance [координаты] [координаты] – используется для вычисления расстояния между двумя наборами координат.
?Дискриминатор [4 члена] – создает список пользователей, у которых есть определенный номер дискриминатора Discord.
?membercount – генерирует общее количество пользователей на определенном сервере.
?serverinfo – Получает общую информацию о сервере, включая номера участников, количество каналов и текущее количество людей в сети и активных.
•emotes – Создает полный список всех смайликов и эмоций для конкретного сервера.