This repository has been archived by the owner on Apr 27, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
lavalink.py
241 lines (225 loc) · 8.5 KB
/
lavalink.py
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
'''
Feito por liveira!
'''
# -------- Area de importações -------- #
import os # Importação da blibioteca do sistema operacional
import datetime # Importação da blibioteca de data
import discloud # Importação da blibioteca do discloud para verificar a RAM!
import json # Importação da blibioteca de manipulação de JSON
from subprocess import Popen
import subprocess # Importação da blibioteca de processos
import time # Importação de blibioteca de tempo
import sys
import re
import asyncio
# -------- Area de inicialização de variaveis! -------- #
# Variavel de configuração do lavalink! Pode ser editado
nw = datetime.datetime.now()
lava_config = """
server: # REST and WS server
port: 2333
address: 0.0.0.0
lavalink:
server:
password: "discloud"
sources:
youtube: true
bandcamp: true
soundcloud: true
twitch: true
vimeo: true
mixer: true
http: true
local: false
bufferDurationMs: 400
youtubePlaylistLoadLimit: 6 # Number of pages at 100 each
youtubeSearchEnabled: true
soundcloudSearchEnabled: true
gc-warnings: true
#ratelimit:
#ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks
#excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink
#strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch
#searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing
#retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times
metrics:
prometheus:
enabled: false
endpoint: /metrics
sentry:
dsn: ""
# tags:
# some_key: some_value
# another_key: another_value
"""
with open('config.json','r') as f: # Abrindo o arquivo JSON
config = json.load(f) # Transformando arquivo em um JSON
# Verificar se os logs estão ativados
if config['logMODE']:
lava_config += '''
logging:
file:
max-history: 10
max-size: 50MB
path: ../../logs/lavalink/
level:
root: INFO
lavalink: INFO
''' # Ativando os LOGS
# Tentativas
bot_process = None
lavalink_process = None
lavalink_tries = 0
### CHECAR DIRETÓRIO ###
def is_dir_valid(dir, name):
for item in os.listdir(dir):
if os.path.isdir(dir+"/"+item) and item == name:
print("Achei")
return True # Se ele encontrar o arquivo no diretorio retorna verdadeiro
# Caso não achar, retorna falso
return False
def is_file_valid(dir,name):
for item in os.listdir(dir):
if not os.path.isdir(item) and item == name:
return True # Se ele encontrar o arquivo no diretorio retorna verdadeiro
# Caso não achar, retorna falso
return False
### FIM DE CHECAR DIRETÓRIO ###
### RODAR LAVALINK ###
async def run_lavalink():
print("Iniciando Lavalink...")
global lavalink_process
lavalink_process = Popen(['java','-jar','Lavalink.jar'],cwd='./java/lavalink')
global lavalink_tries
if lavalink_tries < 3:
if lavalink_process.poll == None:
print('Tentando reineicar o lava link')
lavalink_tries += 1
run_lavalink()
else:
print('O lavalink caiu mais de 3 vezes, proecsso desligado')
bot_process.kill()
lavalink_process.kill()
sys.kill(1)
### FIM DE RODAR LAVALINK ###
### INICIAR BOT ###
async def run_bot(dir):
print("Preparando o Bot...")
req = ""
# INSTALAR BIBLIOTECAS
with open("./bot/requirements.txt",'r') as f:
req = f.read()
for i in req.splitlines():
process = Popen(["pip3", "install",i],stdout=subprocess.PIPE, stderr=subprocess.PIPE,)
process.wait()
if config['logMODE']:
with open(f'./logs/{nw}.log','a') as f:
f.write(f"logs:\n{process.stdout.read()}\n\n\n\nerros:\n{process.stderr.read()}")
if process.returncode != 0:
print(f"Erro ao instalar os módulos: {process.stderr.read()}")
if lavalink_process:
lavalink_process.kill()
sys.exit(1)
# LIGAR O BOT
print("Iniciando o bot...")
global bot_process
bot_process = Popen(['python3',config['fileRunBot']],cwd='./bot',encoding='utf-8',stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(30)
# ENQUANTO O BOT NÃO MORRER(ter status code)
while not bot_process.poll:
# se os logs estiverem desativados
if not config['logMODE']:
continue
# se os logs estiverem ativados
# capturar logs
log = bot_process.stdout.read().encode("utf-8")
# capturar logs de erros
try:
logErr = bot_process.stderr.read().encode("utf-8")
except AttributeError:
logErr = None
# se algum erro for gerado, salvar ele
if logErr != bot_process.stderr.read().encode("utf-8"):
logErr2 = bot_process.stderr.read().encode("utf-8").replace(logErr,"")
with open(f'./logs/{nw}.log','w+') as f:
f.writelines(logErr2)
logErr += logErr2
# se o ultimo log for diferente dos logs atuais(foi escrito algum log), salvar ele
if log != bot_process.stdout.read().encode("utf-8"):
log2 = bot_process.stdout.read().encode("utf-8").replace(log,"")
with open(f'./logs/{nw}.log','w+') as f:
f.writelines(log2)
log += log2
time.sleep(5)
else:
# se o bot morrer
print(f"O bot caiu: {bot_process.stderr.read()}")
# matar o lavalink
if lavalink_process:
lavalink_process.kill()
bot_process.kill()
sys.exit(1)
### FIM DE INICIAR BOT ###
### INICIAR TUDO ###
async def run():
# checar o SO
if os.name != "posix":
print("Este código só funciona em distribuições linux")
sys.exit(1)
# informações de memória ram
ram = discloud.total_ram()
if ram == 'Dados não encontrados':
return print('Verificação de RAM indisponivel')
nRam = int(re.match("^(\d*)(?:[a-zA-Z]*)$",ram).group(1))
lRam = re.match("^(\d*)([a-zA-Z]*)$",ram).group(2)
if nRam < 512 and lRam.upper() == 'MB':
print(f'Você só tem {ram} disponivel, o minimo para você não ter problemas é 512MB!')
else:
print(f"Você tem disponivel {ram}")
# criar pastas
print("Preparando o sistema")
# criar a pasta de logs
if config['logMODE'] and not is_dir_valid("./","logs"):
try:
os.mkdir("logs")
except Exception as ex:
print(f"Erro ao criar a pasta logs: {ex.args}")
sys.exit(1)
# criar a pasta java
if not is_dir_valid('./','java'):
try:
os.mkdir("java")
except Exception as ex:
print(f"Erro ao criar a pasta java: {ex.args}")
sys.exit(1)
# checar o arquivo principal
if not is_file_valid("./bot",config['fileRunBot']):
print(f"O arquivo {config['fileRunBot']} não foi encontrado")
sys.exit(1)
if not is_dir_valid('./java','lavalink'): # criar a pasta lavalink dentro da pasta java
try:
os.mkdir("./java/lavalink")
except Exception as ex:
print(f"Erro ao criar a pasta lavalink: {ex.args}")
sys.exit(1)
if not is_file_valid("./java/lavalink","Lavalink.jar"): # se não tiver o arquivo do lavalink, baixar
print('Baixando o lavalink')
down_lava_cmd = ["wget","-c", "-O", "Lavalink.jar", config['lavalink']]
downlava = None
if config['logMODE']: # se os logs estiverem ativados, salvar os logs do download
down_lava_cmd.insert(2, f"../../logs/lavalinkdown-{nw}.log")
down_lava_cmd.insert(2, f"-o")
downlava = Popen(down_lava_cmd, encoding="utf-8", cwd="./java/lavalink",stdout=subprocess.PIPE, stderr=subprocess.PIPE)
downlava.wait()
if downlava.returncode != 0:
print(f"Erro ao baixar o lavalink: - {downlava.stderr.read().encode('utf-8')}")
sys.exit(1)
print("Lavalink baixado com sucesso")
if is_file_valid("./java/lavalink","application.yml"):
os.remove("./java/lavalink/application.yml")
with open('./java/lavalink/application.yml','w+') as f:
f.write(lava_config)
await run_lavalink()
time.sleep(30)
await run_bot('./bot')
asyncio.run(run())