Skip to content

Commit e0b8984

Browse files
committed
Update bot: return Xur checker and refactor code
1 parent 8db7294 commit e0b8984

File tree

6 files changed

+147
-105
lines changed

6 files changed

+147
-105
lines changed

bot/bot_functions.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
from fuzzywuzzy import process
66

77
import image_parser as parser
8-
import bot_words_storage as st
8+
import bot_storage as st
99

1010

1111
def word_lists_counter() -> int:
1212
"""Function to get number of word lists from file 'bot_words_storage.py'."""
1313
lists_counter = 0
14-
storage_path = os.path.join(os.path.dirname(__file__), 'bot_words_storage.py')
14+
storage_path = os.path.join(os.path.dirname(__file__), 'bot_storage.py')
1515

1616
if os.path.exists(storage_path):
1717
with open(storage_path) as file:
@@ -42,7 +42,7 @@ def discord_message_analysis(message: discord.MessageType) -> str:
4242
for iteration in range(word_lists_number):
4343
if result is None:
4444
found_word, rating = process.extractOne(word, referring_to_word_lists[iteration])
45-
result = callback_from_word_lists[iteration] if rating > 85 else None
45+
result = callback_from_word_lists[iteration] if rating > 95 else None
4646

4747
return result
4848

@@ -58,17 +58,22 @@ def bad_word_finder(message: discord.MessageType) -> str:
5858
for word in message_content_list:
5959
found_word, rating = process.extractOne(word, st.bad_words_list)
6060
if result is None:
61-
result = found_word if rating > 75 else None
61+
result = found_word if rating > 95 else None
6262

6363
return result
6464

6565

66+
def select_answer() -> str:
67+
"""Function to select random answer."""
68+
index = random.randint(0, len(st.ANSWERS) - 1)
69+
return st.ANSWERS[index]
70+
71+
6672
def image_selection() -> str:
6773
"""Function to randomize image choice."""
6874
start_of_link = 'http://babenki.info/'
6975
image_links_list = parser.get_images()
70-
image_count = len(image_links_list)
71-
choice = random.randint(0, image_count)
76+
choice = random.randint(0, len(image_links_list)-1)
7277

7378
link = start_of_link + image_links_list[choice]
7479

bot/bot_main.py

Lines changed: 90 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import os
22
import asyncio
33
import random
4+
45
import discord
5-
from discord.ext import commands
6+
from discord import Intents
7+
from discord.ext import commands, tasks
68

79
from load_environment import load_environment
8-
from bot_functions import discord_message_analysis
9-
from bot_functions import bad_word_finder
10-
from bot_functions import image_selection
11-
from xur_destiny2 import is_xur_here
12-
from xur_destiny2 import get_xur_location
10+
from bot_functions import discord_message_analysis, bad_word_finder, select_answer, image_selection
11+
from xur_destiny2 import XurChecker
1312

1413

1514
load_environment()
@@ -18,13 +17,17 @@
1817
BOT_TOKEN = os.getenv('BOT_TOKEN')
1918
PREFIX = '!'
2019

21-
bot = commands.Bot(command_prefix=PREFIX)
20+
bot = commands.Bot(command_prefix=PREFIX, intents=Intents.all())
21+
bot.intents.members = True
2222
bot.remove_command('help')
2323

24+
xur_checker = XurChecker()
25+
2426

2527
@bot.event
2628
async def on_ready():
2729
print(f'{bot.user.name} в сети.')
30+
is_xur_arrived.start()
2831

2932

3033
@bot.event
@@ -33,7 +36,7 @@ async def on_member_join(member):
3336
f'Можешь ознакомиться со списком доступных команд !help и обязательно прочти наши !rules. '
3437
f'Мой баннхаммер не знает пощады!')
3538

36-
guest_role = discord.utils.get(member.guild.roles, name='Гость')
39+
guest_role = discord.utils.get(member.guild.roles, id=780843833817563166)
3740
await member.add_roles(guest_role)
3841

3942

@@ -65,10 +68,12 @@ async def on_message(message):
6568
await message.channel.send(f'До скорого, {message_author.mention}!')
6669
elif result == 'bad':
6770
bad_word = bad_word_finder(message)
68-
await message.channel.send(f'Так ты сам, {message_author.mention}, {bad_word} получается.')
71+
answer = select_answer()
72+
await message.channel.send(f'Выявлен нарушитель священного пункта № 1 правил Общества '
73+
f'в связи с использованием "{bad_word}"!')
74+
await message.channel.send(f'{message_author.mention} {answer}')
6975
elif result == 'help':
70-
await message.channel.send(f'{message_author.mention}, хочешь узнать список команд? '
71-
f'Напиши !help в чат.')
76+
await message.channel.send(f'{message_author.mention}, хочешь узнать список команд? Напиши !help в чат.')
7277

7378
await bot.process_commands(message)
7479

@@ -77,27 +82,53 @@ async def on_message(message):
7782
async def help(ctx):
7883
await ctx.channel.purge(limit=1)
7984

80-
embed = discord.Embed(colour=discord.Color.gold(), title='Навигация по командам:')
85+
embed = discord.Embed(
86+
colour=discord.Color.gold(),
87+
title='Навигация по командам:'
88+
)
89+
8190
embed.set_author(name=bot.user.name, icon_url=bot.user.avatar_url)
82-
embed.add_field(name=f'{PREFIX}help', value='Выводит список команд.')
83-
embed.add_field(name=f'{PREFIX}rules', value='Выводит список правил сервера.')
84-
embed.add_field(name=f'{PREFIX}boobs', value='Безмерно радует всех Сиськолюбов.')
85-
embed.add_field(name=f'{PREFIX}duel @target_name', value='Позволяет вызвать на дуэль и испытать удачу. '
86-
'Проигравший отправляется в мут на 60 секунд.')
91+
92+
embed.add_field(name=f'{PREFIX}help', value='Выводит список команд.', inline=False)
93+
embed.add_field(name=f'{PREFIX}rules', value='Выводит список правил сервера.', inline=False)
94+
embed.add_field(name=f'{PREFIX}boobs', value='Безмерно радует всех Сиськолюбов.', inline=False)
95+
embed.add_field(name=f'{PREFIX}xur', value='Сообщает местонахождение Зура.', inline=False)
96+
embed.add_field(name=f'{PREFIX}duel @target_name',
97+
value='Позволяет вызвать на дуэль и испытать удачу. Проигравший отправляется в мут на 60 секунд.',
98+
inline=False)
8799

88100
await ctx.send(embed=embed)
89101

90102

91-
@bot.command()
103+
@bot.command(aliases=['правила', 'Правила'])
92104
async def rules(ctx):
93105
await ctx.channel.purge(limit=1)
94106

95-
embed = discord.Embed(colour=discord.Color.gold(), title='Правила сервера:')
96-
embed.set_author(name=bot.user.name, icon_url=bot.user.avatar_url)
97-
embed.add_field(name='0.', value='Всегда уважай Великий Разум!', inline=True)
98-
embed.add_field(name='1.', value='Мы здесь отдыхаем, поэтому будь дружелюбнее.', inline=True)
99-
embed.add_field(name='2.', value='Запрещено быть душным мудилой и говорить "можно скажу?" в голосовом чате.',
100-
inline=True)
107+
embed = discord.Embed(
108+
colour=discord.Color.gold(),
109+
title='Правила сервера:'
110+
)
111+
112+
embed.set_author(
113+
name=bot.user.name,
114+
icon_url=bot.user.avatar_url
115+
)
116+
117+
embed.add_field(
118+
name='Пункт № 0.',
119+
value='Всегда уважай Великий Разум!',
120+
inline=False
121+
)
122+
embed.add_field(
123+
name='Пункт № 1.',
124+
value='Мы здесь отдыхаем, поэтому будь дружелюбнее.',
125+
inline=False
126+
)
127+
embed.add_field(
128+
name='Пункт № 2.',
129+
value='Запрещено быть душным мудилой и говорить "можно скажу?" в голосовом чате.',
130+
inline=False
131+
)
101132

102133
await ctx.send(embed=embed)
103134

@@ -108,41 +139,41 @@ async def clear(ctx, amount_to_delete=2):
108139
await ctx.channel.purge(limit=amount_to_delete)
109140

110141

111-
@bot.command(aliases=['бан'])
142+
@bot.command(aliases=['бан', 'Бан'])
112143
@commands.has_permissions(administrator=True)
113144
async def mute(ctx, member: discord.Member):
114145
await ctx.channel.purge(limit=1)
115146

116-
mute_role = discord.utils.get(ctx.message.guild.roles, name='Заключенный')
147+
mute_role = discord.utils.get(ctx.message.guild.roles, id=780439303603355648)
117148
await member.add_roles(mute_role)
118149

119150
await ctx.send(f'Великий Разум пожелал, чтобы {member.mention} немного помолчал.')
120151
await member.send(f'Фреймы призваны помогать людям, поэтому я здесь. Тебя забанил {ctx.author.name}. '
121-
f'Причина мне неизвестна, однако Великий Разум обратил на тебя своё внимание, это такая честь!')
152+
f'Причина мне неизвестна, однако Великий Разум ничего не делает просто так!')
122153

123154

124-
@bot.command(aliases=['разбан'])
155+
@bot.command(aliases=['разбан', 'Разбан'])
125156
@commands.has_permissions(administrator=True)
126157
async def unmute(ctx, member: discord.Member):
127158
await ctx.channel.purge(limit=1)
128159

129-
mute_role = discord.utils.get(ctx.message.guild.roles, name='Заключенный')
160+
mute_role = discord.utils.get(ctx.message.guild.roles, id=780439303603355648)
130161
await member.remove_roles(mute_role)
131162

132163
await ctx.send(f'Великий Разум сжалился над {member.mention} и он снова может говорить.')
133164
await member.send(f'Ты снова можешь говорить. '
134165
f'Пожалуйста, для твоего блага, постарайся больше не раздражать Великий Разум.')
135166

136167

137-
@bot.command()
168+
@bot.command(aliases=['дуэль', 'Дуэль'])
138169
async def duel(ctx, member: discord.Member):
139170
await ctx.channel.purge(limit=1)
140171

141172
duelist1 = ctx.author.name
142173
duelist2 = member.name
143174
duelists = [duelist1, duelist2]
144175

145-
mute_role = discord.utils.get(ctx.message.guild.roles, name='Заключенный')
176+
mute_role = discord.utils.get(ctx.message.guild.roles, id=780439303603355648)
146177

147178
await ctx.send(f'{duelist1} бросает перчатку вызова {duelist2}. Приготовиться к дуэли! '
148179
f'Великий Разум назначил меня вашим секундантом.')
@@ -172,36 +203,48 @@ async def duel(ctx, member: discord.Member):
172203
async def boobs(ctx):
173204
await ctx.channel.purge(limit=1)
174205

175-
image = image_selection()
206+
image_url = image_selection()
207+
208+
embed = discord.Embed(
209+
colour=discord.Color.gold(),
210+
description='Решил порадовать друзей.'
211+
)
212+
embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url)
213+
214+
# Проверка URL изображения. Если длина менее 20 символов, значит изображение не спарсилось и нужно вывести ошибку.
215+
if len(image_url) < 25:
216+
embed.add_field(
217+
name='Но у него ничего не вышло!',
218+
value='Видимо, все девочки заняты, попробуй позже <:harold:970308021546795038>',
219+
inline=False
220+
)
221+
else:
222+
embed.set_image(url=image_url)
176223

177-
await ctx.send(image)
178-
await ctx.send(f'{ctx.author.name} решил порадовать друзей.')
224+
await ctx.send(embed=embed)
179225

180226

181227
@bot.command(aliases=['зур', 'Зур'])
182228
async def xur(ctx):
183229
await ctx.channel.purge(limit=1)
184230

185-
xur_location = get_xur_location()
231+
xur_location = xur_checker.get_xur_location()
186232

187233
await ctx.send(f'{ctx.author.mention} {xur_location}')
188234

189235

236+
@tasks.loop(hours=1)
190237
async def is_xur_arrived():
191238
await bot.wait_until_ready()
192239
channel = bot.get_channel(int(CHANNEL_ID))
193-
message_sent = False
194-
195-
while True:
196-
if is_xur_here():
197-
if not message_sent:
198-
xur_location = get_xur_location()
199-
await channel.send(f'{xur_location}')
200-
message_sent = True
201-
if not is_xur_here():
202-
message_sent = False
203-
204-
await asyncio.sleep(60 * 60)
240+
241+
if xur_checker.is_xur_here():
242+
if not xur_checker.message_is_sent:
243+
xur_location = xur_checker.get_xur_location()
244+
await channel.send(f'{xur_location}')
245+
xur_checker.message_is_sent = True
246+
if not xur_checker.is_xur_here():
247+
xur_checker.message_is_sent = False
205248

206249

207250
if __name__ == '__main__':

bot/bot_storage.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
hello_words_list = ('привет', 'здорова', 'салам')
2+
3+
by_words_list = ('пока', 'до свидания', 'сваливаю')
4+
5+
help_words_list = ('помощь', 'хелп', 'команды')
6+
7+
bad_words_list = ('пидор', 'хуй', 'сука', 'блядь', 'бля', 'ебать', 'ебанул', 'пизда', 'заебись', 'жопа', 'говно',
8+
'нахуй')
9+
10+
ANSWERS = (
11+
'В таких случаях Великий Разум позволил мне использовать могучий артефакт из Уно - <:reverse:970267180891512842>!',
12+
'НЕ ВЫРАЖАЙСЯ! <:captan:970266647208263690>',
13+
'Ублюдок, мать твою, а ну иди сюда, гавно собачье, решил ко мне лезть? '
14+
'Ты, засранец вонючий, мать твою, а ну иди сюда, попробуй меня трахнуть! '
15+
'Я тебя сам трахну, ублюдок, онанист чертов, будь ты проклят!'
16+
)

bot/bot_words_storage.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

bot/image_parser.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
URL = 'http://babenki.info/siski/7487-krasivaya-golaya-grud-78-foto.html'
66

77

8-
def get_images():
8+
def get_images() -> []:
99
"""Function parsing shared link to find photos."""
1010
session = requests.Session()
1111
response = session.get(URL)
@@ -31,7 +31,4 @@ def get_images():
3131
except TypeError:
3232
pass
3333

34-
else:
35-
return 'Сайт не отвечает на запросы.'
36-
3734
return image_list

0 commit comments

Comments
 (0)