Skip to content

Commit

Permalink
PEP8 + Firebase update
Browse files Browse the repository at this point in the history
  • Loading branch information
Rarmash committed Jun 15, 2024
1 parent 2f7c6d9 commit 84934e4
Show file tree
Hide file tree
Showing 24 changed files with 473 additions and 316 deletions.
1 change: 0 additions & 1 deletion .env_template
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
TOKEN=
APPLICATIONID=
MONGODB=
FORTNITEAPI=
XBOXAPI=
DEBUGMODE=OFF
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
__pycache__
gears/__pycache__
**/__pycache__
bin/*
*.exe
.env
Expand Down
29 changes: 15 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,30 @@
# R4Bot ![Version](https://img.shields.io/badge/Latest-1.0.1/master-blue.svg)
# R4Bot ![Version](https://img.shields.io/badge/Latest-1.1/master-blue.svg)
Discord-бот, созданный для облегчения модерации серверов, и не только. Используются слэш-команды.

## 🛠️ Установка
1. Клонируйте репозиторий:
```BASH
git clone https://github.com/Rarmash/R4bot.git
```
```BASH
git clone https://github.com/Rarmash/R4bot.git
```
2. Смените директорию:
```BASH
cd R4bot
```
```BASH
cd R4bot
```
3. Установите зависимости:
```BASH
pip install -r requirements.txt
```
```BASH
pip install -r requirements.txt
```
4. Загрузите и установите [FFMPEG](https://ffmpeg.org/) (как вариант - в корень проекта).

5. Запустите файл Python:
```BASH
python main.py
```
```BASH
python main.py
```

6. Настройте бота через файлы servers.json и .env (шаблон - [.env_template](https://github.com/Rarmash/R4Bot/blob/master/.env_template)).

7. Сгенерируйте ключ доступа к своему приложению [Firebase](https://console.firebase.google.com) (в панели управления: `Project Settings` -> `Service accounts` -> `Firebase Admin SDK` -> `Python`).

## 🛠️ О servers.json:
Бот поддерживает нахождение на нескольких серверах. Просто продублируйте блок с настройками сервера и заполните его.
```JSON
Expand Down Expand Up @@ -56,7 +58,6 @@ python main.py
```ENV
TOKEN= // Токен бота Discord
APPLICATIONID= // Application ID приложения бота с Discord Developer Portal
MONGODB= // Адрес для подключения к БД MongoDB
FORTNITEAPI= // Ключ API для получения данных с https://fortnite-api.com/
XBOXAPI= // Ключ API для получения данных с https://xbl.io/
DEBUGMODE=OFF // Значение DEBUG-режима
Expand Down
12 changes: 7 additions & 5 deletions gears/events.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from discord.ext import commands


class Events(commands.Cog):

def __init__(self, bot):
self.bot = bot

@commands.Cog.listener()
async def on_application_command_error(self, ctx, error):
if isinstance(error, commands.CommandOnCooldown):
Expand All @@ -16,12 +17,13 @@ async def on_voice_state_update(self, member, before, after):
# Check if the member's voice state has changed and if they were in a voice channel before the update
voice_state = member.guild.voice_client
if voice_state is None:
return
return

# Check if the voice channel is empty (only the bot remains in the channel)
# Check if the voice channel is empty (only the bot remains in the channel)
if len(voice_state.channel.members) == 1:
# If the voice channel is empty, disconnect the bot from the voice channel
await voice_state.disconnect()



def setup(bot):
bot.add_cog(Events(bot))
bot.add_cog(Events(bot))
101 changes: 58 additions & 43 deletions gears/fortnite.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,30 @@
import discord
from discord.ext import commands
from discord.commands import SlashCommandGroup
from options import fortniteapi, myclient, servers_data
import requests
from discord.commands import SlashCommandGroup
from discord.ext import commands

from modules.firebase import update_record, get_from_record, search_record_id
from options import fortniteapi, servers_data


# Helper function to make a request to the Fortnite API
def fortnite_api_request(username):
request_url = f"https://fortnite-api.com/v2/stats/br/v2?name={username}"
response = requests.get(request_url, params={"displayName": username}, headers={"Authorization": fortniteapi})
response_data = response.json()
return response_data.get("data"), response_data.get("status")


# Helper function to get the Fortnite username for the user
def get_fortnite_username(ctx, username):
if not username:
author_id = str(ctx.author.id)
user_data = get_from_record(str(ctx.guild.id), "Users", author_id)
if user_data:
username = user_data.get("fortnite")

return username


class Fortnite(commands.Cog):
def __init__(self, bot, servers_data):
Expand All @@ -11,47 +33,33 @@ def __init__(self, bot, servers_data):

fortnite = SlashCommandGroup("fortnite", "Команды по Fortnite")

# Helper function to make a request to the Fortnite API
def fortnite_api_request(self, username):
request_url = f"https://fortnite-api.com/v2/stats/br/v2?name={username}"
response = requests.get(request_url, params={"displayName": username}, headers={"Authorization": fortniteapi})
response_data = response.json()
return response_data.get("data"), response_data.get("status")

# Helper function to get the Fortnite username for the user
def get_fortnite_username(self, ctx, username):
if not username:
author_id = str(ctx.author.id)
user_data = myclient[f"{str(ctx.guild.id)}"]["Users"].find_one({"_id": author_id})
if user_data:
username = user_data.get("fortnite")

return username

# Command to view Fortnite stats for a player
@fortnite.command(description='Посмотреть статистику по игроку')
async def stats(self, ctx: discord.ApplicationContext, username = None):
Collection = myclient[f"{str(ctx.guild.id)}"]["Users"]
async def stats(self, ctx: discord.ApplicationContext, username=None):
server_data = self.servers_data.get(str(ctx.guild.id))
if not server_data:
return

await ctx.defer()

# Get the Fortnite username for the player
username = self.get_fortnite_username(ctx, username)
# Check if the Fortnite username is available
if not username:
await ctx.respond("Вы не привязали профиль Fortnite к учётной записи Discord. Сделайте это, используя команду `/fortnite connect <username>`!")
await ctx.respond(
"Вы не привязали профиль Fortnite к учётной записи Discord. Сделайте это, используя команду "
"`/fortnite connect <username>`!")
return

# Make a request to the Fortnite API for the stats data
stats_data, status = self.fortnite_api_request(username)

# Handle different status codes
if status == 403:
guide_files = [discord.File(f'resources/fortnite/fortnitestatsguide{i}.png') for i in range(1, 4)]
await ctx.respond(f"❗ Данные игрока **{username}** скрыты (ошибка **{status}**).\nЕсли это ваш аккаунт, откройте статистику в настройках игры.", files=guide_files)
await ctx.respond(
f"❗ Данные игрока **{username}** скрыты (ошибка **{status}**).\nЕсли это ваш аккаунт, откройте статистику в настройках игры.",
files=guide_files)
return
elif status == 404:
await ctx.respond(f"❗ Игрок **{username}** не найден (ошибка **{status}**).")
Expand All @@ -61,7 +69,8 @@ async def stats(self, ctx: discord.ApplicationContext, username = None):
return
try:
# Create and send the stats embed
embed = discord.Embed(title=f'Статистика игрока {stats_data["account"]["name"]}', color=int(server_data.get("accent_color"), 16))
embed = discord.Embed(title=f'Статистика игрока {stats_data["account"]["name"]}',
color=int(server_data.get("accent_color"), 16))
embed.add_field(name="🎟️ Уровень боевого пропуска", value=f'{stats_data["battlePass"]["level"]}')
embed.add_field(name="🎮 Всего матчей сыграно", value=f'{stats_data["stats"]["all"]["overall"]["matches"]}')
embed.add_field(name="👑 Всего побед", value=f'{stats_data["stats"]["all"]["overall"]["wins"]}')
Expand All @@ -71,22 +80,26 @@ async def stats(self, ctx: discord.ApplicationContext, username = None):
embed.add_field(name="🎖 Всего топ-25", value=f'{stats_data["stats"]["all"]["overall"]["top25"]}')
embed.add_field(name="💀 Всего убийств", value=f'{stats_data["stats"]["all"]["overall"]["kills"]}')
embed.add_field(name="☠️ Убийств в минуту", value=f'{stats_data["stats"]["all"]["overall"]["killsPerMin"]}')
embed.add_field(name="☠️ Убийств за матч", value=f'{stats_data["stats"]["all"]["overall"]["killsPerMatch"]}')
embed.add_field(name="☠️ Убийств за матч",
value=f'{stats_data["stats"]["all"]["overall"]["killsPerMatch"]}')
embed.add_field(name="⚰️ Всего смертей", value=f'{stats_data["stats"]["all"]["overall"]["deaths"]}')
embed.add_field(name="📈 Общее K/D", value=f'{stats_data["stats"]["all"]["overall"]["kd"]}')
embed.add_field(name="📉 % побед", value=f'{stats_data["stats"]["all"]["overall"]["winRate"]}')
embed.add_field(name="🕓 Всего сыграно минут", value=f'{stats_data["stats"]["all"]["overall"]["minutesPlayed"]}')
embed.add_field(name="🙋‍♂️ Всего игроков пережито", value=f'{stats_data["stats"]["all"]["overall"]["playersOutlived"]}')

embed.add_field(name="🕓 Всего сыграно минут",
value=f'{stats_data["stats"]["all"]["overall"]["minutesPlayed"]}')
embed.add_field(name="🙋‍♂️ Всего игроков пережито",
value=f'{stats_data["stats"]["all"]["overall"]["playersOutlived"]}')

# Add the owner of the profile if available in the database
try:
embed.add_field(name = "Владелец профиля", value=f"<@{Collection.find_one({'fortnite': username})['_id']}>")
embed.add_field(name="Владелец профиля",
value=f"<@{search_record_id(str(ctx.guild.id), "Users", "fortnite", username)}>")
except TypeError:
pass
await ctx.respond(embed = embed)
await ctx.respond(embed=embed)
except KeyError:
await ctx.respond("Ошибка при получении статистики.")

# Command to view the Fortnite map
@fortnite.command(description='Посмотреть карту')
async def map(self, ctx: discord.ApplicationContext):
Expand All @@ -104,15 +117,14 @@ async def map(self, ctx: discord.ApplicationContext):

embed = discord.Embed(title='Карта Fortnite', color=int(server_data.get("accent_color"), 16))
embed.set_image(url=map_data)
await ctx.respond(embed=embed)
await ctx.respond(embed=embed)

@fortnite.command(description='Привязать профиль Fortnite к учётной записи Discord')
async def connect(self, ctx: discord.ApplicationContext, username):
server_data = self.servers_data.get(str(ctx.guild.id))
if not server_data:
return

Collection = myclient[f"{str(ctx.guild.id)}"]["Users"]
await ctx.defer()
author_id = str(ctx.author.id)

Expand All @@ -121,9 +133,12 @@ async def connect(self, ctx: discord.ApplicationContext, username):
await ctx.respond(f"При добавлении возникла ошибка **{status}**.\nВозможно, вы неверно указали никнейм.")
return

Collection.update_one({"_id": author_id}, {"$set": {"fortnite": username}})
embed = discord.Embed(description=f"Аккаунт {username} был успешно привязан к вашей учётной записи!\nЕсли вы измените никнейм в игре, не забудьте его перепривязать здесь.", color=int(server_data.get("accent_color"), 16))
update_record(str(ctx.guild.id), "Users", author_id, {"fortnite": username})
embed = discord.Embed(
description=f"Аккаунт {username} был успешно привязан к вашей учётной записи!\nЕсли вы измените никнейм в игре, не забудьте его перепривязать здесь.",
color=int(server_data.get("accent_color"), 16))
await ctx.respond(embed=embed)



def setup(bot):
bot.add_cog(Fortnite(bot, servers_data))
bot.add_cog(Fortnite(bot, servers_data))
Loading

0 comments on commit 84934e4

Please sign in to comment.