Compare commits
3 Commits
master
...
js-rewrite
Author | SHA1 | Date | |
---|---|---|---|
e15664e39a | |||
b3974987a1 | |||
e98c36b270 |
10
.gitignore
vendored
10
.gitignore
vendored
@ -1,7 +1,5 @@
|
|||||||
__pycache__
|
|
||||||
*.pyc
|
|
||||||
venv/
|
|
||||||
.env
|
.env
|
||||||
*.log
|
.vscode/
|
||||||
*.log.*
|
node_modules/
|
||||||
.vscode/
|
package-lock.json
|
||||||
|
config.json
|
25
bot/bot.py
25
bot/bot.py
@ -1,25 +0,0 @@
|
|||||||
import logging
|
|
||||||
|
|
||||||
from discord import Intents
|
|
||||||
from discord.ext import commands
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class DiscordBot(commands.Bot):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__(
|
|
||||||
command_prefix="@",
|
|
||||||
intents=Intents.all()
|
|
||||||
)
|
|
||||||
|
|
||||||
async def on_ready(self):
|
|
||||||
await self.wait_until_ready()
|
|
||||||
await self.tree.sync()
|
|
||||||
log.info("Bot is synced and ready")
|
|
||||||
|
|
||||||
async def load_cogs(self, cog_path: str):
|
|
||||||
log.info("Loading cogs")
|
|
||||||
for path in cog_path.iterdir():
|
|
||||||
if path.suffix == ".py":
|
|
||||||
await self.load_extension(f"cogs.{path.stem}")
|
|
@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 1,
|
|
||||||
"disable_existing_loggers": false,
|
|
||||||
"formatters": {
|
|
||||||
"simple": {
|
|
||||||
"format": "%(levelname)s %(message)s"
|
|
||||||
},
|
|
||||||
"detail": {
|
|
||||||
"format": "[%(asctime)s] [%(levelname)s] [%(name)s]: %(message)s"
|
|
||||||
},
|
|
||||||
"complex": {
|
|
||||||
"format": "[%(levelname)s|%(module)s|L%(lineno)d] %(asctime)s %(message)s",
|
|
||||||
"datefmt": "%Y-%m-%dT%H:%M:%S%z"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"handlers": {
|
|
||||||
"stdout": {
|
|
||||||
"class": "logging.StreamHandler",
|
|
||||||
"level": "DEBUG",
|
|
||||||
"formatter": "simple",
|
|
||||||
"stream": "ext://sys.stdout"
|
|
||||||
},
|
|
||||||
"file": {
|
|
||||||
"class": "logging.handlers.RotatingFileHandler",
|
|
||||||
"level": "DEBUG",
|
|
||||||
"formatter": "complex",
|
|
||||||
"filename": "logs/pyrss.log",
|
|
||||||
"maxBytes": 1048576,
|
|
||||||
"backupCount": 3
|
|
||||||
},
|
|
||||||
"queue_handler": {
|
|
||||||
"class": "logging.handlers.QueueHandler",
|
|
||||||
"handlers": [
|
|
||||||
"stdout",
|
|
||||||
"file"
|
|
||||||
],
|
|
||||||
"respect_handler_level": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"loggers": {
|
|
||||||
"root": {
|
|
||||||
"level": "DEBUG",
|
|
||||||
"handlers": [
|
|
||||||
"queue_handler"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"discord": {
|
|
||||||
"level": "INFO"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
53
main.py
53
main.py
@ -1,53 +0,0 @@
|
|||||||
import json
|
|
||||||
import atexit
|
|
||||||
import asyncio
|
|
||||||
import logging
|
|
||||||
import logging.config
|
|
||||||
from os import getenv
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
|
||||||
load_dotenv(override=True)
|
|
||||||
|
|
||||||
from bot.bot import DiscordBot
|
|
||||||
from web.app import create_app
|
|
||||||
|
|
||||||
BASE_DIR = Path(__file__).parent
|
|
||||||
|
|
||||||
async def start_web():
|
|
||||||
app = create_app()
|
|
||||||
await app.run_task(host="0.0.0.0", port=5000)
|
|
||||||
|
|
||||||
async def start_bot(token: str):
|
|
||||||
async with DiscordBot() as bot:
|
|
||||||
await bot.load_cogs(BASE_DIR / "bot" / "cogs")
|
|
||||||
await bot.start(token, reconnect=True)
|
|
||||||
|
|
||||||
def setup_logging():
|
|
||||||
# load config from file
|
|
||||||
log_config_path = BASE_DIR / "logs" / "config.json"
|
|
||||||
if not log_config_path.exists():
|
|
||||||
raise FileNotFoundError("Logging config not found")
|
|
||||||
|
|
||||||
with open(log_config_path, "r") as file:
|
|
||||||
logging_config = json.load(file)
|
|
||||||
|
|
||||||
logging.config.dictConfig(logging_config)
|
|
||||||
|
|
||||||
# create queue handler for non-blocking logs
|
|
||||||
queue_handler = logging.getHandlerByName("queue_handler")
|
|
||||||
if queue_handler is not None:
|
|
||||||
queue_handler.listener.start()
|
|
||||||
atexit.register(queue_handler.listener.stop)
|
|
||||||
|
|
||||||
async def main():
|
|
||||||
bot_token = getenv("BOT_TOKEN")
|
|
||||||
if not bot_token:
|
|
||||||
raise ValueError("'BOT_TOKEN' is missing")
|
|
||||||
|
|
||||||
setup_logging()
|
|
||||||
|
|
||||||
await asyncio.gather(start_web(), start_bot(bot_token))
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
asyncio.run(main())
|
|
@ -1,27 +0,0 @@
|
|||||||
aiofiles==24.1.0
|
|
||||||
aiohappyeyeballs==2.4.4
|
|
||||||
aiohttp==3.11.11
|
|
||||||
aiosignal==1.3.2
|
|
||||||
attrs==24.3.0
|
|
||||||
blinker==1.9.0
|
|
||||||
click==8.1.8
|
|
||||||
discord.py==2.4.0
|
|
||||||
Flask==3.1.0
|
|
||||||
frozenlist==1.5.0
|
|
||||||
h11==0.14.0
|
|
||||||
h2==4.1.0
|
|
||||||
hpack==4.0.0
|
|
||||||
Hypercorn==0.17.3
|
|
||||||
hyperframe==6.0.1
|
|
||||||
idna==3.10
|
|
||||||
itsdangerous==2.2.0
|
|
||||||
Jinja2==3.1.5
|
|
||||||
MarkupSafe==3.0.2
|
|
||||||
multidict==6.1.0
|
|
||||||
priority==2.0.0
|
|
||||||
propcache==0.2.1
|
|
||||||
python-dotenv==1.0.1
|
|
||||||
Quart==0.20.0
|
|
||||||
Werkzeug==3.1.3
|
|
||||||
wsproto==1.2.0
|
|
||||||
yarl==1.18.3
|
|
24
src/bot.js
Normal file
24
src/bot.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
const discord = require("discord.js");
|
||||||
|
const fileSystem = require("fs");
|
||||||
|
|
||||||
|
// const { GatewayIntentBits } = require("discord.js");
|
||||||
|
|
||||||
|
const client = new discord.Client({
|
||||||
|
intents: []
|
||||||
|
});
|
||||||
|
|
||||||
|
const config = require("./config/config.json");
|
||||||
|
client.config = config;
|
||||||
|
|
||||||
|
fileSystem.readdir("./events/", (error, files) => {
|
||||||
|
if (error) { return console.error(error); }
|
||||||
|
files.forEach(file => {
|
||||||
|
const event = require (`./events/${file}`);
|
||||||
|
const eventName = file.split(".")[0];
|
||||||
|
client.on(eventName, event.bind(null, client));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(config.token);
|
||||||
|
|
||||||
|
exports.client = client;
|
18
src/events/ready.js
Normal file
18
src/events/ready.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const chalk = require("chalk");
|
||||||
|
const config = require("../config/config.json")
|
||||||
|
require("../bot");
|
||||||
|
|
||||||
|
module.exports = client => {
|
||||||
|
// console.clear();
|
||||||
|
|
||||||
|
console.log(chalk.bold.green("Launched Successfully...\n"));
|
||||||
|
console.log(chalk.magenta("Version:"), chalk.cyan("-"));
|
||||||
|
console.log(chalk.magenta("Made by"), chalk.cyan("Corbz"));
|
||||||
|
console.log(chalk.magenta("Prefix:"), chalk.cyan(`${config.prefix}\n`));
|
||||||
|
|
||||||
|
if (client.user) {
|
||||||
|
console.log(chalk.green(chalk.bold(client.user.username), "is online!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(chalk.green("website:", chalk.underline(`http://localhost:${config.port}`)));
|
||||||
|
};
|
48
src/index.js
Normal file
48
src/index.js
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
const discord = require("./bot");
|
||||||
|
const express = require("express");
|
||||||
|
const engine = require("ejs-blocks");
|
||||||
|
const session = require("express-session");
|
||||||
|
const flash = require("connect-flash");
|
||||||
|
const fileUpload = require("express-fileupload");
|
||||||
|
const config = require("./config/config.json");
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const http = require("http").Server(app);
|
||||||
|
const io = require("socket.io")(http);
|
||||||
|
|
||||||
|
port = config.port;
|
||||||
|
|
||||||
|
app.use(express.static("./public"));
|
||||||
|
app.use(express.static("./themes"));
|
||||||
|
app.engine("ejs", engine);
|
||||||
|
app.set("view engine", "ejs");
|
||||||
|
app.use(express.urlencoded({ extended: true, limit: "5mb" }));
|
||||||
|
app.use(fileUpload());
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
session({
|
||||||
|
secret: "test",
|
||||||
|
resave: true,
|
||||||
|
saveUninitialized: true
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
app.use(flash());
|
||||||
|
|
||||||
|
app.use((req, res, next) => {
|
||||||
|
res.locals.success = req.flash("success"),
|
||||||
|
res.locals.error = req.flash("error");
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use("/", require("./routes/home.js"));
|
||||||
|
|
||||||
|
http.listen(port);
|
||||||
|
|
||||||
|
// io.sockets.on("connection", sockets => {
|
||||||
|
|
||||||
|
// });
|
||||||
|
|
||||||
|
app.use((req, res) => {
|
||||||
|
res.status(404).render("error_pages/404");
|
||||||
|
});
|
33
src/package.json
Normal file
33
src/package.json
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "pyrss-ng",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitea.cor.bz/corbz/pyrss-ng.git"
|
||||||
|
},
|
||||||
|
"license": "ISC",
|
||||||
|
"author": "",
|
||||||
|
"type": "commonjs",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"start": "node index.js",
|
||||||
|
"dev": "nodemon index.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"connect-flash": "^0.1.1",
|
||||||
|
"discord.js": "^14.17.3",
|
||||||
|
"ejs": "^3.1.10",
|
||||||
|
"ejs-blocks": "^0.1.4",
|
||||||
|
"express": "^4.21.2",
|
||||||
|
"express-fileupload": "^1.5.1",
|
||||||
|
"express-session": "^1.18.1",
|
||||||
|
"lolcatjs": "^2.4.3",
|
||||||
|
"socket.io": "^4.8.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "^9.18.0",
|
||||||
|
"nodemon": "^3.1.9"
|
||||||
|
}
|
||||||
|
}
|
14
src/routes/home.js
Normal file
14
src/routes/home.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const express = require("express");
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.get("/", (request, response) => {
|
||||||
|
response.redirect("/home");
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/home", (request, response) => {
|
||||||
|
response.render("home/home", {
|
||||||
|
title: "pyrss-ng · home",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
2
src/views/home/home.ejs
Normal file
2
src/views/home/home.ejs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<%- layout("../layout") %>
|
||||||
|
hello world
|
12
src/views/layout.ejs
Normal file
12
src/views/layout.ejs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf=8">
|
||||||
|
<title><%- title %></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
start
|
||||||
|
<%- body %>
|
||||||
|
end
|
||||||
|
</body>
|
||||||
|
</html>
|
12
web/app.py
12
web/app.py
@ -1,12 +0,0 @@
|
|||||||
import logging
|
|
||||||
|
|
||||||
from quart import Quart
|
|
||||||
from .routes.dashboard import dashboard
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
def create_app():
|
|
||||||
log.info("Creating web app and registering blueprints")
|
|
||||||
app = Quart(__name__)
|
|
||||||
app.register_blueprint(dashboard, url_prefix="/dashboard")
|
|
||||||
return app
|
|
0
web/index.css
Normal file
0
web/index.css
Normal file
0
web/index.html
Normal file
0
web/index.html
Normal file
@ -1,7 +0,0 @@
|
|||||||
from quart import Blueprint
|
|
||||||
|
|
||||||
dashboard = Blueprint("dashboard", __name__)
|
|
||||||
|
|
||||||
@dashboard.route("/")
|
|
||||||
async def home():
|
|
||||||
return "Dashboard page"
|
|
Loading…
x
Reference in New Issue
Block a user