[英]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.