бэта сайта, убрал мусор, чуть-чуть допилил код

This commit is contained in:
2023-04-27 16:27:23 +07:00
committed by Тамара
parent 9aca8ad10e
commit ccd320141e
12 changed files with 237 additions and 198 deletions
+2 -2
View File
@@ -29,7 +29,7 @@ share/python-wheels/
*.egg *.egg
MANIFEST MANIFEST
.idea/ .idea/
logs/ static/logs/
config config
# PyInstaller # PyInstaller
# Usually these files are written by a python script from a template # Usually these files are written by a python script from a template
@@ -132,4 +132,4 @@ dmypy.json
# Pyre type checker # Pyre type checker
.pyre/ .pyre/
/logs/ /static/logs/
+1 -1
View File
@@ -7,7 +7,7 @@ import json
bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") # создаю объект бота bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") # создаю объект бота
dp = Dispatcher(bot) # создаю объект слушателя dp = Dispatcher(bot) # создаю объект слушателя
logger.remove() # удаляю стандартный логер logger.remove() # удаляю стандартный логер
logger.add("logs/logging_log.log", level="INFO") # создаю логер logger.add("static/logs/logging_log.log", level="INFO") # создаю логер
@dp.message_handler(commands=['start']) # обрабатываю команду start @dp.message_handler(commands=['start']) # обрабатываю команду start
BIN
View File
Binary file not shown.
+7 -5
View File
@@ -15,15 +15,17 @@ def loging(message: types.Message, service: str, file_path: str, text: str, f: f
:param f: float - длинна аудиофайла :param f: float - длинна аудиофайла
:return: None :return: None
""" """
if not os.path.isdir(f"logs/{message.chat.id}"): # если папки нет if not os.path.isdir(f"static/logs/{message.chat.id}"): # если папки нет
os.makedirs(f"logs/{message.chat.id}") # создаю папку os.makedirs(f"static/logs/{message.chat.id}") # создаю папку
file_name = file_path.split("/")[-1].split(".") # достаю имя файла file_name = file_path.split("/")[-1].split(".") # достаю имя файла
try: # защита try: # защита
os.makedirs(f"logs/{message.chat.id}/{file_name[0]}") # создание папки os.makedirs(f"static/logs/{message.chat.id}/{file_name[0]}") # создание папки
except FileExistsError: except FileExistsError:
pass pass
shutil.copy(file_path, f"logs/{message.chat.id}/{file_name[0]}/audio.{file_name[1]}") # копирование файла shutil.copy(file_path, f"static/logs/{message.chat.id}/{file_name[0]}/audio.{file_name[1]}")
with open(f'logs/{message.chat.id}/{file_name[0]}/{service}-text.txt', 'w+') as the_file: # открываю файл в запись # копирование файла
with open(f'static/logs/{message.chat.id}/{file_name[0]}/{service}-text.txt', 'w+') as the_file:
# открываю файл в запись
the_file.write(text) # записываю the_file.write(text) # записываю
user_id = message.from_user.id user_id = message.from_user.id
group_id = message.chat.id group_id = message.chat.id
-3
View File
@@ -1,3 +0,0 @@
Привет!
-3
View File
@@ -1,3 +0,0 @@
, ты тот, кто сказал, что я должен идти
Да, я говорил это! Я думаю, что было бы здорово, если бы ты вышел и исследовал мир. Это откроет ваш разум и даст вам новые впечатления.
+20
View File
@@ -0,0 +1,20 @@
.player-container {
width: 100%;
height: 50px;
background-color: #d54242;
display: flex;
align-items: center;
justify-content: center;
}
#audio-player {
width: 80%;
}
#audio-controls {
display: flex;
}
#audio-controls button {
margin-right: 10px;
}
+64
View File
@@ -0,0 +1,64 @@
class AudioPlayer {
constructor(options) {
this.container = options.container;
this.audioFile = options.audioFile;
this.audio = new Audio(this.audioFile);
this.isPlaying = false;
this.playButton = null;
this.pauseButton = null;
this.render();
}
render() {
const containerElement = document.querySelector(this.container);
const audioPlayerElement = document.createElement('div');
audioPlayerElement.id = 'audio-player';
const audioControlsElement = document.createElement('div');
audioControlsElement.id = 'audio-controls';
this.playButton = document.createElement('button');
this.playButton.innerHTML = '<i class="fa fa-play"></i>';
this.playButton.addEventListener('click', () => {
if (!this.isPlaying) {
this.play();
}
});
this.pauseButton = document.createElement('button');
this.pauseButton.innerHTML = '<i class="fa fa-pause"></i>';
this.pauseButton.addEventListener('click', () => {
if (this.isPlaying) {
this.pause();
}
});
audioControlsElement.appendChild(this.playButton);
audioControlsElement.appendChild(this.pauseButton);
audioPlayerElement.appendChild(audioControlsElement);
containerElement.appendChild(audioPlayerElement);
}
play() {
if (!this.isPlaying) {
this.audio.play();
this.isPlaying = true;
this.playButton.style.display = 'none';
this.pauseButton.style.display = 'inline-block';
}
}
pause() {
if (this.isPlaying) {
this.audio.pause();
this.isPlaying = false;
this.playButton.style.display = 'inline-block';
this.pauseButton.style.display = 'none';
}
}
}
+16
View File
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<div class="container">
<h1>Login</h1>
<form method="post" action="/login">
<label for="password">Password:</label>
<input type="password" name="password" id="password">
<button type="submit">Login</button>
</form>
</div>
</body>
</html>
+39
View File
@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<!-- Audio Player -->
<script src="https://kit.fontawesome.com/025ae7f87a.js" crossorigin="anonymous"></script>
<link href="{{ url_for('static', path='/audio-player/css/player.css') }}" rel="stylesheet">
<script src="{{ url_for('static', path='/audio-player/js/player.js') }}"></script>
</head>
<body>
<div class="container">
<div class="text-file">
{% for lo in log %}
<div>
<div class="player-container" id="player-container-{{ loop.index }}"></div>
<script>
new AudioPlayer({
container: '#player-container-{{ loop.index }}',
audioFile: '{{ lo.audio_file }}'
});
</script>
{% if lo.text %}
{% for line in lo.text %}
{{ line }}<br>
{% endfor %}
{% else %}
No text file found.
{% endif %}
</div>
{% endfor %}
</div>
</div>
</body>
</html>
+31
View File
@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>Logs</title>
</head>
<body>
<div class="container">
<h1>Logs</h1>
{% if logs %}
<ul class="logs-list">
{% for log in logs %}
<li><a href="/logs/{{ log[0] }}">{{ log[1] }}</a></li>
{% endfor %}
</ul>
{% else %}
No logs found.
{% endif %}
{% if logged_in %}
Logged in as admin.
{% else %}
You need to be logged in to view this page.
{% endif %}
</div>
</body>
</html>
+59 -186
View File
@@ -1,198 +1,71 @@
from flask import Flask, request, jsonify from typing import Dict, Any, List, Tuple, Optional
import logging import os
import random from fastapi import FastAPI, Request, Form, Depends, Cookie, responses, templating, HTTPException
from starlette.staticfiles import StaticFiles
app = Flask(__name__) app = FastAPI()
templates = templating.Jinja2Templates(directory="static/templates")
logging.basicConfig(level=logging.INFO) app.mount("/static", StaticFiles(directory="static"), name="static")
cities = {
'москва': [['1540737/daa6e420d33102bf6947', '213044/7df73ae4cc715175059e'], "Россия"],
'нью-йорк': [['1652229/728d5c86707054d4745f', '1030494/aca7ed7acefde2606bdc']],
'париж': [["1652229/f77136c2364eb90a3ea8", '123494/aca7ed7acefd12e606bdc']]
}
sessionStorage = {}
@app.route('/post', methods=['POST']) def is_logged_in(logged_in: Optional[str] = Cookie(None)):
def main(): return bool(logged_in)
logging.info('Request: %r', request.json)
response = {
'session': request.json['session'],
'version': request.json['version'],
'response': {
'end_session': False
}
}
handle_dialog(response, request.json)
logging.info('Response: %r', response)
return jsonify(response)
def handle_dialog(res, req): @app.get("/", response_class=responses.HTMLResponse)
user_id = req['session']['user_id'] def index(request: Request):
if req['session']['new']: return templates.TemplateResponse("index.html", {"request": request})
res['response']['text'] = 'Привет! Назови своё имя!'
sessionStorage[user_id] = {
'first_name': None,
'game_started': False
}
return
if sessionStorage[user_id]['first_name'] is None:
first_name = get_first_name(req) @app.post("/login")
if first_name is None: async def login(password: str = Form(...)):
res['response']['text'] = 'Не расслышала имя. Повтори, пожалуйста!' if password == "password":
response = responses.RedirectResponse(url="/logs", status_code=303)
response.set_cookie(key="logged_in", value="true")
return response
return {"message": "Invalid password"}
@app.get("/logs", response_class=responses.HTMLResponse)
async def logs(request: Request, logged_in: bool = Depends(is_logged_in)):
if logged_in:
return templates.TemplateResponse("logs.html", {"request": request, "logs": get_logs()})
else: else:
sessionStorage[user_id]['first_name'] = first_name responses.RedirectResponse(url="/login", status_code=303)
sessionStorage[user_id]['guessed_cities'] = []
res['response']['text'] = f'Приятно познакомиться, {first_name.title()}. Я Алиса. Отгадаешь город по фото?'
res['response']['buttons'] = [ @app.get("/logs/{log_id}", response_class=responses.HTMLResponse)
{ async def log(request: Request, log_id: int, logged_in: bool = Depends(is_logged_in)):
'title': 'Да', if logged_in:
'hide': True if not get_log(log_id):
}, raise HTTPException(status_code=400)
{ return templates.TemplateResponse("log.html", {"request": request,
'title': 'Нет', "log": get_log(log_id)})
'hide': True
}
]
else: else:
if not sessionStorage[user_id]['game_started']: responses.RedirectResponse(url="/login", status_code=303)
if 'да' in req['request']['nlu']['tokens']:
if len(sessionStorage[user_id]['guessed_cities']) == 3:
res['response']['text'] = 'Ты отгадал все города!'
res['end_session'] = True
else:
sessionStorage[user_id]['game_started'] = True
sessionStorage[user_id]['attempt'] = 1
play_game(res, req)
elif 'нет' in req['request']['nlu']['tokens']:
res['response']['text'] = 'Ну и ладно!'
res['end_session'] = True
else:
res['response']['text'] = 'Не поняла ответа! Так да или нет?'
res['response']['buttons'] = [
{
'title': 'Да',
'hide': True
},
{
'title': 'Нет',
'hide': True
}
]
else:
play_game(res, req)
def play_game(res, req):
user_id = req['session']['user_id'] def get_logs() -> List[Tuple[int, str]]:
city = random.choice(list(cities.keys())) return [(int(os.path.basename(dir_path)), dir_path.split("/")[2].strip())
while city in sessionStorage[user_id]['guessed_cities']: for dir_path, _, filenames in os.walk("static/logs")
city = random.choice(list(cities.keys())) if dir_path != "static/logs" and len(dir_path.split("/")) == 3]
sessionStorage[user_id]['city'] = city
sessionStorage[user_id]['country'] = cities[city][1]
sessionStorage[user_id]['guessed_cities'].append(city)
images = cities[city][0]
res['response']['card'] = {}
res['response']['card']['type'] = 'BigImage'
res['response']['card']['title'] = 'Что это за город?'
res['response']['card']['image_id'] = random.choice(images)
res['response']['text'] = 'Тогда сыграем! Как называется этот город?'
def check_city(res, req): def get_log(log_id: int) -> List[Dict[str, Any]]:
user_id = req['session']['user_id'] log_dir = os.path.join("static/logs", str(log_id))
if req['request']['original_utterance'].lower() == sessionStorage[user_id]['city']: return_dir = []
if len(sessionStorage[user_id]['guessed_cities']) == 3: for dir_path, _, filenames in os.walk(log_dir):
res['response']['text'] = f'Правильно! Ты отгадал все города!' if dir_path != log_dir:
res['end_session'] = True audio_file = os.path.join(dir_path, "audio.ogg")
else: if not os.path.exists(audio_file):
res['response']['text'] = f'Правильно! Следующий город - {play_game(res, req)}' audio_file = os.path.join(dir_path, "audio.wav")
sessionStorage[user_id]['game_started'] = False text_file = os.path.join(dir_path, "yandex-text.txt")
del sessionStorage[user_id]['attempt'] if not os.path.exists(text_file):
text_file = os.path.join(dir_path, "google-text.txt")
# Добавляем вопрос о стране try:
res['response']['buttons'] = [ return_dir.append({"id": log_id, "audio_file": f"/{audio_file}",
{ "text": open(text_file).read().split("\n")})
'title': 'Да', except UnicodeDecodeError:
'hide': True, pass
}, return return_dir
{
'title': 'Нет',
'hide': True,
}
]
else:
if sessionStorage[user_id]['attempt'] == 3:
res['response'][
'text'] = f'Вы проиграли! Правильный ответ - {sessionStorage[user_id]["city"]}. Сыграем еще?'
del sessionStorage[user_id]['attempt']
sessionStorage[user_id]['game_started'] = False
res['response']['buttons'] = [
{
'title': 'Да',
'hide': True,
},
{
'title': 'Нет',
'hide': True,
}
]
else:
sessionStorage[user_id]['attempt'] += 1
res['response']['text'] = f'Неправильно. Попробуй еще раз!'
def check_country(res, req):
user_id = req['session']['user_id']
if req['request']['original_utterance'].lower() == sessionStorage[user_id]['country']:
res['response']['text'] = f'Правильно! Следующий город - {play_game(res, req)}'
del sessionStorage[user_id]['attempt']
res['response']['buttons'] = [
{
'title': 'Да',
'hide': True,
},
{
'title': 'Нет',
'hide': True,
}
]
else:
if sessionStorage[user_id]['attempt'] == 3:
res['response'][
'text'] = f'Вы проиграли! Правильный ответ - {sessionStorage[user_id]["country"]}. Сыграем еще?'
del sessionStorage[user_id]['attempt']
sessionStorage[user_id]['game_started'] = False
res['response']['buttons'] = [
{
'title': 'Да',
'hide': True,
},
{
'title': 'Нет',
'hide': True,
}
]
else:
sessionStorage[user_id]['attempt'] += 1
res['response']['text'] = f'Неправильно. Попробуй еще раз!'
def get_city(req):
for entity in req['request']['nlu']['entities']:
if entity['type'] == 'YANDEX.GEO':
return entity['value'].get('city', None)
def get_first_name(req):
for entity in req['request']['nlu']['entities']:
if entity['type'] == 'YANDEX.FIO':
return entity['value'].get('first_name', None)
if __name__ == '__main__':
app.run(port=52520)