feat: add tag detector for TOWER message flagging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import { detectTags, isFlagged } from './tag-detector';
|
||||
|
||||
const ADMINS = ['1234567890@s.whatsapp.net', '0987654321@s.whatsapp.net'];
|
||||
|
||||
describe('detectTags', () => {
|
||||
it('detects #important hashtag (case-insensitive)', () => {
|
||||
expect(detectTags('Check this #IMPORTANT update', 'user@s.whatsapp.net', ADMINS))
|
||||
.toContain('#important');
|
||||
});
|
||||
|
||||
it('detects #upparivar hashtag (case-insensitive)', () => {
|
||||
expect(detectTags('Welcome to #UPParivar community', 'user@s.whatsapp.net', ADMINS))
|
||||
.toContain('#upparivar');
|
||||
});
|
||||
|
||||
it('detects #event hashtag', () => {
|
||||
expect(detectTags('Join our #event on Saturday', 'user@s.whatsapp.net', ADMINS))
|
||||
.toContain('#event');
|
||||
});
|
||||
|
||||
it('detects /tower command prefix', () => {
|
||||
expect(detectTags('/tower save this message', 'user@s.whatsapp.net', ADMINS))
|
||||
.toContain('#tower-command');
|
||||
});
|
||||
|
||||
it('detects multiple tags in one message', () => {
|
||||
const tags = detectTags('#important #event happening', 'user@s.whatsapp.net', ADMINS);
|
||||
expect(tags).toContain('#important');
|
||||
expect(tags).toContain('#event');
|
||||
});
|
||||
|
||||
it('detects admin sender', () => {
|
||||
expect(detectTags('Regular message', '1234567890@s.whatsapp.net', ADMINS))
|
||||
.toContain('#admin');
|
||||
});
|
||||
|
||||
it('returns empty array for untagged message from non-admin', () => {
|
||||
expect(detectTags('Just a regular chat message', 'nobody@s.whatsapp.net', ADMINS))
|
||||
.toEqual([]);
|
||||
});
|
||||
|
||||
it('returns empty array for empty text', () => {
|
||||
expect(detectTags('', 'nobody@s.whatsapp.net', ADMINS)).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isFlagged', () => {
|
||||
it('returns true when tags array is non-empty', () => {
|
||||
expect(isFlagged(['#important'])).toBe(true);
|
||||
});
|
||||
|
||||
it('returns false when tags array is empty', () => {
|
||||
expect(isFlagged([])).toBe(false);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,23 @@
|
||||
const HASHTAGS: Array<{ pattern: RegExp; tag: string }> = [
|
||||
{ pattern: /#important/i, tag: '#important' },
|
||||
{ pattern: /#upparivar/i, tag: '#upparivar' },
|
||||
{ pattern: /#event/i, tag: '#event' },
|
||||
];
|
||||
|
||||
export function detectTags(text: string, senderJid: string, adminJids: string[]): string[] {
|
||||
const tags: string[] = [];
|
||||
|
||||
for (const { pattern, tag } of HASHTAGS) {
|
||||
if (pattern.test(text)) tags.push(tag);
|
||||
}
|
||||
|
||||
if (text.trimStart().startsWith('/tower')) tags.push('#tower-command');
|
||||
|
||||
if (adminJids.includes(senderJid)) tags.push('#admin');
|
||||
|
||||
return tags;
|
||||
}
|
||||
|
||||
export function isFlagged(tags: string[]): boolean {
|
||||
return tags.length > 0;
|
||||
}
|
||||
Reference in New Issue
Block a user