-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
165 lines (136 loc) · 4.73 KB
/
main.py
File metadata and controls
165 lines (136 loc) · 4.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
'''
SpoiledBot
File: main.py
Author: Justin Thoreson
Version: 1.0
'''
from dotenv import load_dotenv
from enum import Enum
import discord
import os
import re
class Mode(Enum):
'''Spoiled Bot spoiler modes'''
OFF = 'off'
SPOIL = 'spoil'
UNSPOIL = 'unspoil'
INVERT = 'invert'
class Level(Enum):
'''Spoiled Bot pain levels'''
NORMAL = 'normal'
AGONY = 'agony'
class SpoiledBot(discord.Client):
'''The Spoiled Bot class'''
def __init__(self) -> None:
super().__init__(intents=self.__load_intents())
self.mode = Mode.INVERT
self.level = Level.AGONY
@staticmethod
def __load_intents() -> discord.Intents:
'''Establishes the intents for the Discord bot'''
intents = discord.Intents().default()
intents.message_content = True
return intents
async def on_ready(self) -> None:
print('Logged in as {0.user}'.format(self))
async def on_message(self, message: discord.Message) -> None:
'''
Processes a message whenever one is sent
:param message: A Discord message object
'''
if self.mode == Mode.OFF or message.author == self.user:
return
elif message.channel == self.get_channel(message.channel.id) and message.webhook_id == None:
webhook = await message.channel.create_webhook(name='delete')
await message.delete()
await webhook.send(
content=self.__execute(message.content),
username=message.author.display_name,
avatar_url=message.author.avatar.url
)
await webhook.delete()
def __execute(self, message: str) -> str:
'''
Executes the functionality of Spoiled Bot
:param message: The message to process
:return: The processed message
'''
match self.mode:
case Mode.SPOIL:
return self.__spoil(message)
case Mode.UNSPOIL:
return self.__unspoil(message)
case Mode.INVERT:
return self.__invert(message)
@staticmethod
def __spoil(message: str) -> str:
'''
Spoils a message marked as a spoiler
:param message: The message to spoil
:returne: The spoiled message
'''
spoiled = message
pattern = re.compile(r'\|{2}.*?\|{2}')
while found := pattern.search(spoiled):
start, end = found.span()
section = found.group()[2:-2]
spoiled = ''.join([spoiled[:start], section, spoiled[end:]])
return spoiled
def __unspoil(self, message: str) -> str:
'''
Marks a message as a spoiler
:param message: The message to mark as a spoiler
:return: The message marked as a spoiler
'''
return self.__hide(message.replace('||', ''))
def __hide(self, message: str) -> str:
'''
Hides a message depending on the pain level
:param message: The message to hide
:return: The hiden message
'''
match self.level:
case Level.NORMAL:
return self.__hide_message(message)
case Level.AGONY:
return self.__hide_each_character(message)
@staticmethod
def __hide_message(message: str) -> str:
'''
Marks an entire message as a spoiler
:param message: The message in which to hide
:return: The hidden message
'''
return ''.join(['||', message, '||']) if message else ''
@staticmethod
def __hide_each_character(message: str) -> str:
'''
Marks each character in a message as a spoiler
:param message: The message in which to hide each character
:return: The message with individually hidden characters
'''
hidden = ''
for c in message:
hidden = ''.join([hidden, '||', c, '||'])
return hidden
def __invert(self, message: str) -> str:
'''
Unveils the hidden content and hides the visible content within a message
:param message: The message to invert
:return: The inverted message
'''
pattern = re.compile(r'\|{2}.*?\|{2}')
spoiled = [hidden[2:-2] for hidden in pattern.findall(message)]
marked = [self.__hide(visible) for visible in pattern.split(message)]
result = [marked[0]]
for i in range(0, len(spoiled)):
result.append(spoiled[i])
result.append(marked[i + 1])
return ''.join(result)
def main() -> None:
'''Runs Spoiled Bot'''
load_dotenv()
client = SpoiledBot()
client.run(os.getenv('TOKEN'))
if __name__ == '__main__':
main()