簡體   English   中英

有沒有辦法在 Discord.js 中制作一個僅限表情的頻道?

[英]Is there a way to make a channel emote-only in Discord.js?

我正在尋找一種方法來限制一個文本通道只使用表情。 因此,如果消息包含文本,機器人會立即將其刪除。

代碼邏輯示例:

if (message.isEmoteOnly()) {
  console.log('Emote-only message detected');
} else {
  message.delete();
  message.channel.send('Your message has been deleted! This channel is in emote-only mode.');
}

檢查文本是否采用表情符號格式的一種簡單、更優雅且更少剝削的方法是使用正則表達式

/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g

要查看它的運行情況並了解每個令牌的作用,請在此處查看 我強烈建議在閱讀下面的解釋之前這樣做。

一開始可能看起來有點混亂,所以分解一下它為什么起作用......

  • :[^:\\s]+:
    “正常”表情符號的格式是:name: 周圍的:匹配冒號,而[^:\\s]+匹配中間的字符。 :這將表示模板的結尾)和換行符(將被視為不會形成表情符號的字符)被排除在外。

  • <:[^:\\s]+:[0-9]+>
    自定義表情符號的格式為<:name:id> 周圍的<:>匹配模板的開頭和結尾。 [^:\\s]+匹配名稱。 名稱和 ID 之間的冒號按字面匹配。 [0-9]+匹配里面的數字。 我沒有將\\d用於數字,因為可以匹配其他分類為此類的 Unicode 字符。

  • <a:[^:\\s]+:[0-9]+>
    動畫表情符號的格式為<a:name:id> <>匹配模板的開頭和結尾。 a:從字面上匹配自身。 [^:\\s]+匹配名稱。 :在名稱和 ID 之間逐字匹配。 [0-9]+匹配 ID。

現在,將其實現到您的代碼中...

// Replace all emojis to leave just the text, if any.
const text = message.content.replace(/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g, '');

// Check if 'text' is not blank to see if there are characters which are not used in emojis.
if (text) {
  message.delete()
    .catch(console.error);
}

如果您只想在一條消息中允許一個表情符號,您可以定義字符串的開頭和結尾,並刪除全局修飾符。

/^(:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>)$/

這將確保這是消息中的唯一內容。

編輯:

要在表情符號之間留出空格,您可以在刪除表情符號后簡單地將它們替換為text 在下面的示例中, \\s還包括換行符(如果這不是所需的結果,請將其替換為空格)。

const text = message.content.replace(/:[^:\s]+:|<:[^:\s]+:[0-9]+>|<a:[^:\s]+:[0-9]+>/g, '').replace(/\s+/g, '');

下面測試一下。

 const str = ':smile: <a:parrot:1234> <:parrot:1234>'; const text = str.replace(/:[^:\\s]+:|<:[^:\\s]+:[0-9]+>|<a:[^:\\s]+:[0-9]+>/g, '').replace(/\\s+/g, ''); if (text) console.log('Not allowed.'); else console.log('Allowed.');

嘗試檢查所述清潔消息內容開頭:和端部用: ,或<:>定制表情。 您可以使用

message.content.startsWith(':') && message.content.endsWith(':')

或者

/* 'a' are animated emotes */

(message.content.startsWith('<a:') || message.content.startsWith('<:')) && message.content.endsWith('>')

用戶可以通過執行:emote: loltext :emote:來利用它。 如果你想避免這種情況,我建議過濾掉表情,並檢查字符串是否仍然存在。

// THIS IS A VERY SLOPPY WAY OF DOING THIS!!!!!!! DONT USE THIS FOR PRODUCTION
let split = message.content.split(' ');
for (let i = 0; i < split.length; i++) {
  if (!(split[i].startsWith(':') && split[i].endsWith(':')) && !((split[i].startsWith('<a:') || split[i].startsWith('<:')) && split[i].endsWith('>'))) {
    console.log(`has text: ${split[i]}`)
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM