Как правильно организовать соединение tg WebApp с tg ботом
Не знал как организовать сессию что бы пользователь открыв WebApp видел свои данные из БД. Попытался через GPT сделать и чет не работает подскажите пожалуйста. Надо в класс Dragons во фронте вывести значение из БД.
Backend:
const express = require('express')
const TelegramApi = require('node-telegram-bot-api')
const mysql = require('mysql2')
const PORT = process.env.PORT || 3002
const {useState, useEffect} = require('react')
const bodyParser =require('body-parser')
const cookieParser = require('cookie-parser');
const session = require('express-session');
const cors = require('cors')
let chatids = null;
const app = express()
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(bodyParser())
app.listen(PORT, () =>{
console.log(`Сервер запущен на ${PORT} порту`)
})
const WebApps = "https://backend-drc.ru/"
const token = ""
const connection = mysql.createConnection({
host: "",
user: "",
database: "",
password: ""
})
connection.connect(function(err){
if(err) {
return console.error(`Ошибка подключения! Код: `+ err)
}else{
console.log(`Покдлючение к БД успешно установлено!`)
}
})
app.use(session({
secret: 'telegram-api-game-session-ids-bindex',
resave: false,
saveUninitialized: false,
cookie: {
secure: true,
maxAge: 1000 * 60 * 60 * 24 // 1 день
}
}));
const bot = new TelegramApi(token, {polling: true})
bot.on('message', async msg =>{
const text = msg.text;
const uggs = msg.chat.username;
chatids = msg.chat.id;
if(text === '/start'){
/*const ins = "INSERT INTO `users` (`idteleg`,`chatids`, `usnames`, `Dragons`, `Hunters`, `Defends`, `DRCcoin`, `DRGcoin`) VALUES (NULL,?,?,10,0,0,10,100)"
const into = [chatids, uggs]
await connection.execute(ins, into,(err, results) =>{
})
console.log('Пользователь создан!')*/
await bot.sendPhoto(chatids, "Logo.png")
await bot.sendMessage(chatids,"Dragon Village is build on ....",{
reply_markup: {
inline_keyboard:[
[{text:'Go to Dragon village', web_app:{url: WebApps}}]
]
}
})
}
app.get('/user', async (req, res) => {
const telegramId = req.session.telegramId;
try {
// Получение данных пользователя из базы данных
const [rows] = await connection.execute('SELECT * FROM users WHERE telegram_id = ?', [telegramId]);
// Сохранение данных пользователя в сессию
req.session.user = rows[0];
// Отправка данных пользователю
res.json(rows[0]);
} catch (err) {
console.error(err);
res.status(500).send('Internal server error');
}
});
app.get('/init', (req, res) => {
// Получение telegramId из запроса
const telegramId = req.query.telegramId;
// Сохранение telegramId в сессию
req.session.telegramId = telegramId;
res.send('Session initialized!');
});
})
app.post('/chatback', (req, res) => {
let data = [req.body.Hunters]
const zapros = "UPDATE `users` SET `Dragons`=? WHERE `users`.`usnames` = ?"
const params = [data, uggs]
connection.execute(zapros,params,(err, results) =>{
!err ? res.json(results) : res.json(err)
})
console.log(JSON.stringify(data))
})
app.get('/back1',(req, res) =>{
connection.execute("SELECT `totBank` FROM `stage`",(err, results) => {
if (err) {
console.log(err)
return;
}
res.json({
banks: results[0].totBank
});
});
})
app.get('/back2',(req, res) =>{
connection.execute("SELECT `Seasons` FROM `stage`", (err, results) => {
if (err) {
console.log(err)
return;
}
res.json({
seasons: results[0].Seasons
});
});
})
app.get('/back3',(req, res) =>{
connection.execute("SELECT `toStage` FROM `stage`", (err, results) => {
if (err) {
console.log(err)
return;
}
res.json({
stages: results[0].toStage
});
});
})
app.get('/back4',(req, res) =>{
connection.execute("SELECT `tOnline` FROM `stage`", (err, results) => {
if (err) {
console.log(err)
return;
}
res.json({
online: results[0].tOnline
});
});
})
app.use(cors());
Кусок Frontend'а:
import './Menu.scss'
import React,{useState, useEffect} from 'react';
import axios from 'axios';
export const Menu =()=>{
const [userData, setUserData] = useState(null);
useEffect(() => {
// Получение telegramId из window.tg.initDataUnsafe
const telegramId = window.tg.initDataUnsafe.user.id;
// Инициализация сессии
fetch('http://localhost:3000/init?telegramId='+telegramId)
.then(res => res.json())
.then(() => {
// Получение данных пользователя с сервера
fetch('http://localhost:3000/user')
.then(res => res.json())
.then(data => setUserData(data))
.catch(err => console.error(err));
})
.catch(err => console.error(err));
}, []);
const ClickedInfo = () =>{
alert('Инфо!!')
}
return(
<div className="Menu">
<div className="Info_Bar" onClick={ClickedInfo}></div>
<div className="Dragons">Dragon dynasty:{userData.Dragons}</div>
<div className="Info"> The main inhabitants of the village</div>
</div>
)
}
В БД есть таблица users с полями telegram_id, usnames, Dragons, надо отсюда взять значение dragons по telegram_id и правильно передать на фронт. Если что напишите на @alihan003 может за услугу договоримся?!