g1mp/plugins/imitate.py

127 lines
4.5 KiB
Python
Raw Normal View History

2025-02-13 06:35:15 +00:00
# -*- coding: utf-8 -*-
"""
IRC3 Bot Plugin: Imitator
This plugin for an IRC bot allows the bot to imitate another user by repeating
messages sent by the target user. It also supports an optional Unicode glitch
styling mode for the repeated messages.
Features:
- Imitates messages from a specified user.
- Optionally applies Unicode glitch styling to the messages.
- Supports starting and stopping the imitation via bot commands.
Usage:
=====
To use this module, load it as a plugin in your IRC bot configuration.
Example:
@command
def imitate(self, mask, target, args):
%%imitate [--stop] [--unicode] [<nick>]
Options:
--stop Stop imitating.
--unicode Enable Unicode glitch styling.
Author: Zodiac
"""
2025-02-13 04:55:42 +00:00
import irc3
from irc3.plugins.command import command
import random
# Pre-define the list of Unicode combining characters.
COMBINING_CHARS = [
'\u0300', '\u0301', '\u0302', '\u0303', '\u0304', '\u0305',
'\u0306', '\u0307', '\u0308', '\u0309', '\u030A', '\u030B',
'\u030C', '\u030D', '\u030E', '\u030F', '\u0310', '\u0311',
'\u0312', '\u0313', '\u0314', '\u0315', '\u0316', '\u0317',
'\u0318', '\u0319', '\u031A', '\u031B', '\u031C', '\u031D',
'\u031E', '\u031F', '\u0320', '\u0321', '\u0322', '\u0323',
'\u0324', '\u0325', '\u0326', '\u0327', '\u0328', '\u0329',
'\u032A', '\u032B', '\u032C', '\u032D', '\u032E', '\u032F',
'\u0330', '\u0331', '\u0332', '\u0333', '\u0334', '\u0335',
'\u0336', '\u0337', '\u0338', '\u0339', '\u033A', '\u033B',
'\u033C', '\u033D', '\u033E', '\u033F', '\u0340', '\u0341',
'\u0342', '\u0343', '\u0344', '\u0345', '\u0346', '\u0347',
'\u0348', '\u0349', '\u034A', '\u034B', '\u034C', '\u034D',
'\u034E', '\u034F', '\u0350', '\u0351', '\u0352', '\u0353',
'\u0354', '\u0355', '\u0356', '\u0357', '\u0358', '\u0359',
'\u035A', '\u035B', '\u035C', '\u035D', '\u035E', '\u035F',
'\u0360', '\u0361', '\u0362'
]
@irc3.plugin
class Imitator:
2025-02-13 06:35:15 +00:00
"""A plugin to imitate another user by repeating their messages."""
2025-02-13 04:55:42 +00:00
def __init__(self, bot):
2025-02-13 06:35:15 +00:00
"""
Initialize the plugin with bot reference.
Args:
bot (irc3.IrcBot): The IRC bot instance.
"""
2025-02-13 04:55:42 +00:00
self.bot = bot
self.target = None
self.unicode_mode = False # Flag to enable Unicode glitch styling
def add_combining_characters(self, char):
"""Add random combining characters (with style and color codes) to a character."""
glitched_char = char
# Append between 1 and 3 randomly styled combining characters.
for _ in range(random.randint(1, 3)):
color = random.randint(0, 15)
style = random.choice(['\x02', '\x1F']) # Bold or Underline.
combining_char = random.choice(COMBINING_CHARS)
glitched_char += f'\x03{color}{style}{combining_char}\x0F'
return glitched_char
def style_message(self, message):
"""Apply glitch styling to each character in the message."""
white_color_code = '\x0300' # IRC color code for white.
styled_chars = [
f'{white_color_code}{self.add_combining_characters(c)}'
for c in message
]
return ''.join(styled_chars).strip()
@irc3.event(irc3.rfc.PRIVMSG)
def on_privmsg(self, mask, event, target, data):
"""If a message is received from the target user, repeat it with optional glitch styling."""
if self.target and mask.nick == self.target:
if self.unicode_mode:
data = self.style_message(data)
self.bot.privmsg(target, data)
@command(permission='admin', public=True)
def imitate(self, mask, target, args):
"""
%%imitate [--stop] [--unicode] [<nick>]
Options:
--stop Stop imitating.
--unicode Enable Unicode glitch styling.
"""
stop = args.get('--stop')
nick = args.get('<nick>')
unicode = args.get('--unicode')
if stop:
self.target = None
self.unicode_mode = False
self.bot.privmsg(target, "Stopped imitating.")
return
if not nick:
self.bot.privmsg(target, "Error: You must specify a nick to imitate.")
return
self.target = nick
self.unicode_mode = unicode
self.bot.send_line(f'NICK {nick}_')
if self.unicode_mode:
self.bot.privmsg(target, f"Now imitating {nick} with Unicode glitches!")
else:
self.bot.privmsg(target, f"Now imitating {nick}!")