Compare commits

...

37 Commits

Author SHA1 Message Date
SimolZimol
5f739213e0 modified: templates/minecraft.html
modified:   templates/projects.html
2026-01-22 15:34:36 +01:00
SimolZimol
7bb78aac08 modified: static/css/styles.css
modified:   templates/index.html
	modified:   templates/minecraft.html
2026-01-22 15:30:23 +01:00
SimolZimol
68ece96e16 modified: templates/minecraft.html
modified:   templates/projects.html
	modified:   versions/version.json
2026-01-22 15:18:23 +01:00
SimolZimol
518d4b8bed modified: app.py
modified:   templates/index.html
2026-01-07 17:03:18 +01:00
SimolZimol
e81a18ce34 modified: templates/about.html 2026-01-07 16:58:27 +01:00
SimolZimol
26b53e2f30 modified: app.py
modified:   static/css/styles.css
	modified:   templates/about.html
2026-01-07 16:50:16 +01:00
SimolZimol
2c02f33a13 modified: templates/minecraft.html 2026-01-07 16:37:00 +01:00
SimolZimol
f78da797e1 modified: templates/itemeditor_command_storage.html 2026-01-07 16:32:38 +01:00
SimolZimol
62b5f9c9c6 modified: app.py 2026-01-07 16:29:58 +01:00
SimolZimol
fc30c0b3de modified: templates/base.html
modified:   templates/itemeditor_command_storage.html
2026-01-07 16:27:38 +01:00
SimolZimol
f4975f536a modified: templates/itemeditor_command_storage.html 2026-01-07 15:46:22 +01:00
SimolZimol
2ff7459cc4 modified: templates/itemeditor_command_storage.html
modified:   versions/version.json
2026-01-07 15:42:41 +01:00
SimolZimol
a2f7616aef modified: templates/itemeditor_command_storage.html 2026-01-07 14:50:11 +01:00
SimolZimol
404b2ac77f modified: .gitignore
modified:   app.py
	new file:   command_storage/.gitignore
2026-01-07 04:24:59 +01:00
SimolZimol
6d38651305 modified: app.py 2026-01-07 04:20:42 +01:00
SimolZimol
26a7169515 modified: app.py
modified:   templates/itemeditor_command_storage.html
2026-01-07 04:15:55 +01:00
SimolZimol
e90d28cc10 modified: app.py 2026-01-07 04:12:57 +01:00
SimolZimol
f242250237 modified: templates/itemeditor_command_storage.html 2026-01-07 04:01:26 +01:00
SimolZimol
ff5b0c3a54 modified: templates/itemeditor_command_storage.html 2026-01-07 03:55:19 +01:00
SimolZimol
9e0a1abb53 modified: app.py
new file:   templates/itemeditor_command_storage.html
	modified:   versions/version.json
2026-01-07 03:45:06 +01:00
SimolZimol
3dd524bd84 modified: static/css/styles.css
modified:   templates/projects.html
	modified:   versions/version.json
2026-01-07 02:34:36 +01:00
SimolZimol
7ecdde83cc modified: app.py
modified:   templates/project_detail.html
	modified:   templates/projects.html
	modified:   versions/version.json
2026-01-07 01:46:24 +01:00
SimolZimol
13ea82a5ca modified: app.py
new file:   app_old.py
	modified:   versions/version.json
2026-01-07 00:58:33 +01:00
SimolZimol
9e4efd2c1c modified: Dockerfile 2025-12-23 17:47:03 +01:00
SimolZimol
49ff86155a modified: app.py 2025-12-23 17:42:19 +01:00
SimolZimol
0336d51f3c modified: app.py 2025-12-23 17:36:48 +01:00
SimolZimol
aa5564573f modified: app.py
new file:   versions/version.json
2025-12-23 17:25:19 +01:00
SimolZimol
324a2e93bb modified: app.py 2025-11-11 20:56:48 +01:00
SimolZimol
e2723bf9b9 modified: app.py 2025-11-11 20:53:19 +01:00
SimolZimol
dfe19266bf modified: app.py
new file:   projekte des/SimpleTeleport.md
	modified:   templates/project_detail.html
	modified:   templates/projects.html
2025-11-11 20:50:23 +01:00
SimolZimol
97000b3932 new file: static/android-chrome-192x192.png
new file:   static/android-chrome-512x512.png
	new file:   static/apple-touch-icon.png
	new file:   static/favicon-16x16.png
	new file:   static/favicon-32x32.png
	new file:   static/favicon.ico
	new file:   static/site.webmanifest
	modified:   templates/base.html
2025-10-28 21:37:02 +01:00
SimolZimol
361a81eecf modified: app.py 2025-10-27 17:25:26 +01:00
SimolZimol
bde9ec60b8 modified: app.py 2025-10-27 17:22:12 +01:00
SimolZimol
5191228a4e modified: app.py 2025-10-27 17:19:52 +01:00
SimolZimol
687e245efb modified: app.py 2025-10-27 17:17:40 +01:00
SimolZimol
14349fc666 modified: app.py
modified:   templates/project_detail.html
	modified:   templates/projects.html
2025-10-27 17:07:22 +01:00
SimolZimol
3b58248ccb modified: app.py 2025-10-26 19:58:59 +01:00
22 changed files with 3282 additions and 595 deletions

3
.gitignore vendored
View File

@@ -3,6 +3,9 @@ __pycache__/
*.py[cod]
*$py.class
# Command storage (temporary files)
command_storage/*.json
# Virtual environments
.venv/
venv/

View File

@@ -20,6 +20,7 @@ RUN pip install --upgrade pip && pip install -r requirements.txt
COPY app.py ./
COPY templates ./templates
COPY static ./static
COPY versions ./versions
# Environment variables from Coolify (if used)
ENV DEMO=$DEMO

554
app.py
View File

@@ -1,144 +1,145 @@
import os
from flask import Flask, render_template, jsonify
import json
import uuid
from pathlib import Path
from datetime import datetime, timedelta, timezone
from threading import Lock
from flask import Flask, render_template, jsonify, send_from_directory, request
app = Flask(__name__)
# File-based storage for commands (works across multiple workers)
STORAGE_DIR = Path(__file__).parent / 'command_storage'
STORAGE_DIR.mkdir(exist_ok=True)
storage_lock = Lock()
def cleanup_expired_commands():
"""Remove expired command files"""
now = datetime.now(timezone.utc)
for file_path in STORAGE_DIR.glob('*.json'):
try:
with open(file_path, 'r') as f:
data = json.load(f)
if datetime.fromisoformat(data['expires_at']) < now:
file_path.unlink()
except:
pass # Ignore corrupted files
# Load projects from version.json
def load_projects():
"""Load all projects from version.json"""
json_path = Path(__file__).parent / 'versions' / 'version.json'
with open(json_path, 'r', encoding='utf-8') as f:
return json.load(f)
def get_project_data(project_key, project_info):
"""Convert JSON project data to template format"""
# Determine project type and compatibility
project_type = project_info.get('project_type', 'minecraft')
# Get compatibility info
compat = None
if 'mc_compat' in project_info:
compat = project_info['mc_compat'].get('stable', '')
elif 'velocity_compat' in project_info:
compat = project_info['velocity_compat'].get('stable', '')
# Determine display type
if project_type in ['minecraft', 'spigot', 'paper', 'bukkit']:
display_type = 'Minecraft Plugin'
elif project_type == 'velocity':
display_type = 'Velocity Plugin'
elif project_type == 'discord':
display_type = 'Discord Bot'
else:
display_type = project_type.title()
# Get project status (global project status, not version status)
project_status = project_info.get('project_status', 'active')
# Get version info (prefer beta if specified, otherwise stable)
stable_version = project_info.get('stable', 'N/A')
beta_version = project_info.get('beta')
# Build project dict
return {
'id': project_key,
'name': project_info.get('name', project_key.title()),
'tagline': project_info.get('tagline', ''),
'type': display_type,
'description': project_info.get('description', ''),
'long_description': project_info.get('long_description', ''),
'icon': project_info.get('icon', 'fas fa-cube'),
'color': project_type,
'status': project_status.title(),
'version': stable_version,
'beta_version': beta_version,
'compatibility': compat,
'server_types': project_info.get('server_types', []),
'technologies': project_info.get('technologies', []),
'features': project_info.get('features', []),
'commands': project_info.get('commands', []),
'installation': project_info.get('installation', []),
'technical_highlights': project_info.get('technical_highlights', []),
'links': project_info.get('links', {}),
'download': project_info.get('download', {}),
'downloads': project_info.get('stats', {}).get('downloads', 0) if project_info.get('stats', {}).get('downloads') else None,
'users': None,
'url': f'/projects/{project_key}'
}
# Main routes
@app.route('/')
def home():
"""Homepage with overview of Devanturas and featured projects"""
projects = [
{
'name': 'Fly Plugin',
'type': 'Minecraft Plugin',
'description': 'Lightweight flight plugin for survival servers with configurable speeds and permissions.',
'technologies': ['Java', 'Spigot', 'Paper'],
'status': 'Active',
'url': '/projects/fly-plugin',
'icon': 'fas fa-paper-plane',
'color': 'minecraft'
},
{
'name': 'Hearts of Iron IV ELO Bot',
'type': 'Discord Bot',
'description': 'Sophisticated Discord bot with complete ELO rating system for HOI4 multiplayer communities.',
'technologies': ['Python', 'Discord.py', 'MySQL', 'Docker'],
'status': 'Production',
'url': '/projects/hoi4-elo-bot',
'icon': 'fab fa-discord',
'color': 'discord'
},
{
'name': 'Multus',
'type': 'Discord Bot',
'description': 'Production-ready moderation and restart-safe giveaways with a Flask web dashboard.',
'technologies': ['Python', 'Discord.py', 'Flask', 'MySQL'],
'status': 'Active',
'url': '/projects/discord-ai-bot',
'icon': 'fas fa-shield-alt',
'color': 'discord'
},
{
'name': 'Discord Bot — Stable Diffusion (AMD)',
'type': 'Discord Bot',
'description': 'AI image generation bot optimized for AMD GPUs with Discord commands and queueing.',
'technologies': ['Python', 'Discord.py', 'AI'],
'status': 'Active',
'url': '/projects/discord-bot-stable-diffusion-amd',
'icon': 'fas fa-wand-magic-sparkles',
'color': 'discord'
}
]
all_projects = load_projects()
# Convert to template format - show featured projects (first 6)
projects = []
for key, info in list(all_projects.items())[:6]:
if info.get('name'): # Only show complete projects
projects.append(get_project_data(key, info))
return render_template('index.html', projects=projects)
@app.route('/projects')
def projects():
"""Overview of all projects"""
all_projects = [
{
'name': 'Fly Plugin',
'type': 'Minecraft Plugin',
'description': 'Simple flight for survival servers with speed control and permission management.',
'long_description': 'A lightweight, reliable Minecraft plugin that restores creative-like flying in survival mode. Designed for simplicity and performance.',
'technologies': ['Java', 'Spigot', 'Paper', 'Bukkit'],
'status': 'Active',
'version': '2.3',
'downloads': 'Available',
'url': '/projects/fly-plugin',
'icon': 'fas fa-paper-plane',
'color': 'minecraft',
'links': {
'modrinth': 'https://modrinth.com/plugin/fly-simolzimol/',
'spigot': 'https://www.spigotmc.org/resources/fly.83164/'
}
},
{
'name': 'Hearts of Iron IV ELO Bot',
'type': 'Discord Bot',
'description': 'Advanced Discord bot for competitive HOI4 communities with ELO rating system.',
'long_description': 'A sophisticated Discord bot featuring a complete ELO rating system similar to chess rankings, designed specifically for Hearts of Iron IV multiplayer communities.',
'technologies': ['Python', 'Discord.py', 'MySQL', 'Docker', 'Coolify'],
'status': 'Production',
'version': '2.0',
'users': 'Multiple Communities',
'url': '/projects/hoi4-elo-bot',
'icon': 'fab fa-discord',
'color': 'discord',
'links': {}
},
{
'name': 'Multus',
'type': 'Discord Bot',
'description': 'Moderation, restart-safe giveaways with Steam integration, and a web dashboard.',
'long_description': 'Multus is a production-ready Discord bot with advanced moderation, a persistent giveaway engine (Steam/Epic ready), a Flask-based dashboard, and restart safety via MySQL.',
'technologies': ['Python', 'Discord.py', 'Flask', 'MySQL', 'aiohttp'],
'status': 'Active',
'version': '1.x',
'url': '/projects/discord-ai-bot',
'icon': 'fas fa-shield-alt',
'color': 'discord',
'links': {
'website': 'https://multus.devanturas.net/'
}
},
{
'name': 'Discord Bot — Stable Diffusion (AMD)',
'type': 'Discord Bot',
'description': 'AI image generation with AMD GPUs, Discord commands, and job queuing.',
'long_description': 'A Discord bot for Stable Diffusion image generation optimized for AMD GPUs. Provides prompt-based generation through slash/text commands with async processing.',
'technologies': ['Python', 'Discord.py', 'AI'],
'status': 'Active',
'version': 'Latest',
'url': '/projects/discord-bot-stable-diffusion-amd',
'icon': 'fas fa-wand-magic-sparkles',
'color': 'discord',
'links': {
'github': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD',
'issues': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD/issues'
}
}
]
return render_template('projects.html', projects=all_projects)
all_projects = load_projects()
# Convert all projects to template format
projects_list = []
for key, info in all_projects.items():
if info.get('name'): # Only show complete projects
projects_list.append(get_project_data(key, info))
return render_template('projects.html', projects=projects_list)
@app.route('/minecraft')
def minecraft():
"""Dedicated Minecraft development page"""
minecraft_projects = [
{
'name': 'Fly Plugin',
'description': 'Flight plugin for survival servers',
'version': 'Latest',
'supported_versions': '1.15 - 1.21',
'downloads': 'Active',
'url': '/projects/fly-plugin'
}
]
all_projects = load_projects()
# Filter minecraft plugins only (velocity, spigot, paper, bukkit, etc.)
minecraft_project_types = ['minecraft', 'velocity', 'spigot', 'paper', 'bukkit', 'purpur']
minecraft_projects = []
for key, info in all_projects.items():
if info.get('project_type') in minecraft_project_types and info.get('name'):
proj = {
'name': info.get('name'),
'description': info.get('description', ''),
'version': info.get('stable', 'N/A'),
'supported_versions': info.get('mc_compat', {}).get('stable', 'N/A'),
'downloads': info.get('stats', {}).get('downloads', 'Available'),
'url': f'/projects/{key}'
}
minecraft_projects.append(proj)
minecraft_info = {
'experience': '3+ Years',
'preferred_apis': ['Spigot API', 'Paper API', 'Bukkit API'],
'experience': '9+ Years',
'preferred_apis': ['Spigot API', 'Paper API', 'Bukkit API', 'Velocity API'],
'specialties': ['Plugin Development', 'Server Optimization', 'Custom Commands', 'Permission Systems'],
'server_types': ['Spigot', 'Paper', 'Bukkit']
'server_types': ['Spigot', 'Paper', 'Bukkit', 'Velocity']
}
return render_template('minecraft.html', projects=minecraft_projects, info=minecraft_info)
@@ -149,6 +150,7 @@ def about():
skills = {
'Minecraft Development': [
'Spigot & Paper Plugin Development',
'Velocity Proxy Plugin Development',
'Java Programming',
'Server Administration',
'Performance Optimization',
@@ -175,19 +177,24 @@ def about():
achievements = [
{
'title': 'Fly Plugin',
'description': 'Active on Modrinth & SpigotMC',
'title': 'Published Plugins',
'description': 'Active on Modrinth, Hangar & SpigotMC',
'icon': 'fas fa-download'
},
{
'title': 'Multus Discord Bot',
'description': 'In active development since 2020 for Ludi et Historia',
'icon': 'fab fa-discord'
},
{
'title': 'Open Source',
'description': 'Contributing to GitHub repositories',
'icon': 'fab fa-github'
},
{
'title': 'Community',
'description': 'Supporting Discord communities',
'icon': 'fab fa-discord'
'title': '9+ Years Experience',
'description': 'Developing plugins and bots since 2017',
'icon': 'fas fa-calendar-alt'
}
]
@@ -213,14 +220,14 @@ def contact():
},
{
'name': 'Modrinth',
'url': 'https://modrinth.com/plugin/fly-simolzimol/',
'description': 'Fly Plugin on Modrinth platform',
'url': 'https://modrinth.com/user/SimolZimol',
'description': 'Minecraft plugins on Modrinth platform',
'icon': 'fas fa-cube',
'color': 'modrinth'
},
{
'name': 'SpigotMC',
'url': 'https://www.spigotmc.org/resources/fly.83164/',
'url': 'https://www.spigotmc.org/members/simolzimol.123456/',
'description': 'Minecraft plugins and resources',
'icon': 'fas fa-plug',
'color': 'spigot'
@@ -233,206 +240,103 @@ def contact():
def health():
return jsonify(status='ok'), 200
# Project detail pages
@app.route('/projects/fly-plugin')
def fly_plugin():
"""Detailed page for Fly Plugin"""
project = {
'name': 'Fly Plugin',
'tagline': 'Simple flight for survival servers',
'description': 'A lightweight, reliable Minecraft plugin that restores creative-like flying in survival mode. Designed to be simple for players and server admins.',
'long_description': '''Fly is a minimalist Minecraft plugin focused on providing reliable flight functionality for survival servers.
The plugin emphasizes simplicity, performance, and easy customization while maintaining compatibility across multiple server versions.''',
'version': '2.3',
'status': 'Active Development',
'compatibility': '1.15 - 1.21',
'server_types': ['Spigot', 'Paper', 'Bukkit'],
'technologies': ['Java', 'Spigot API', 'Paper API'],
'features': [
'Toggle flight for yourself: /fly',
'Toggle flight for others: /fly <player>',
'Adjustable flight speed: /fly speed <1-10>',
'Fully configurable messages and prefix',
'Live configuration reload: /flyreload',
'Permission-based access control',
'Lightweight and efficient'
],
'commands': [
{
'command': '/fly',
'description': 'Toggle your own flight',
'permission': 'fly.fly'
},
{
'command': '/fly <player>',
'description': 'Toggle another player\'s flight',
'permission': 'other.fly'
},
{
'command': '/fly speed <1-10>',
'description': 'Set your flight speed',
'permission': 'fly.speed'
},
{
'command': '/flyreload',
'description': 'Reload plugin configuration',
'permission': 'fly.reload'
}
],
'links': {
'modrinth': 'https://modrinth.com/plugin/fly-simolzimol/',
'spigot': 'https://www.spigotmc.org/resources/fly.83164/',
'github': 'https://github.com/SimolZimol/',
'wiki': 'https://github.com/SimolZimol/fly-plugin/wiki',
'issues': 'https://github.com/SimolZimol/fly-plugin/issues'
},
'installation': [
'Download the latest JAR file',
'Place the JAR into your server plugins/ folder',
'Start the server to generate config.yml',
'Edit config.yml to customize messages and settings',
'Use /flyreload to apply changes without restart'
]
}
# Dynamic project detail pages
@app.route('/projects/<project_id>')
def project_detail(project_id):
"""Dynamic project detail page"""
all_projects = load_projects()
if project_id not in all_projects:
return "Project not found", 404
project_info = all_projects[project_id]
project = get_project_data(project_id, project_info)
return render_template('project_detail.html', project=project)
@app.route('/projects/hoi4-elo-bot')
def hoi4_elo_bot():
"""Detailed page for HOI4 ELO Bot"""
project = {
'name': 'Hearts of Iron IV ELO Bot',
'tagline': 'Competitive ranking system for HOI4 communities',
'description': 'A sophisticated Discord bot designed specifically for Hearts of Iron IV multiplayer communities, featuring a complete ELO rating system similar to chess rankings.',
'long_description': '''This bot transforms casual gaming communities into structured competitive environments while maintaining
the fun and social aspects that make multiplayer gaming enjoyable. By providing objective performance metrics and historical tracking,
it helps players improve their skills and creates lasting engagement within gaming communities.''',
'version': '2.0',
'status': 'Production Ready',
'technologies': ['Python', 'Discord.py 2.3.2', 'MySQL', 'Docker', 'Coolify'],
'features': [
'Dual Rating Modes: Standard and Competitive gameplay',
'Chess-like ELO Algorithm with HOI4 modifications',
'T-Level System: Country tier-based multipliers',
'Intelligent draw handling with ELO adjustments',
'Comprehensive player statistics and analytics',
'Match history and leaderboards',
'Hybrid slash and text commands',
'Docker containerization support'
],
'commands': [
{
'command': '/hoi4create <type> <name>',
'description': 'Create new match (standard/competitive)',
'permission': 'User'
},
{
'command': '/hoi4setup <game> <@user> <team> <t-level>',
'description': 'Add player to match',
'permission': 'User'
},
{
'command': '/hoi4end <game> <winner/draw>',
'description': 'Complete match and process ELO',
'permission': 'User'
},
{
'command': '/hoi4stats [@user]',
'description': 'View detailed player statistics',
'permission': 'User'
},
{
'command': '/hoi4leaderboard [type] [limit]',
'description': 'Display ranked player lists',
'permission': 'User'
}
],
'technical_highlights': [
'Asynchronous Programming with Discord.py',
'Normalized database schema with performance optimization',
'Implementation of proven ELO rating algorithms',
'Comprehensive error handling and logging',
'Docker deployment with Coolify integration'
],
'links': { }
}
return render_template('project_detail.html', project=project)
# Item Editor Command Storage
@app.route('/projects/itemeditor/storage')
def itemeditor_command_storage():
"""Item Editor Command Storage page"""
return render_template('itemeditor_command_storage.html')
@app.route('/projects/discord-ai-bot')
def discord_ai_bot():
"""Detailed page for Discord AI Bot — Moderation & Giveaways"""
project = {
'name': 'Multus',
'tagline': 'Moderation & Giveaways — Production-ready bot with a web dashboard',
'description': 'Multus provides advanced moderation, a persistent giveaway engine with Steam/Epic integration, and a Flask admin dashboard. Focused on reliability and UX.',
'long_description': (
'A production-ready Discord bot combining advanced moderation (warnings, temporary mutes with auto-restore), '
'a restart-safe giveaway system with UUID-based IDs and Steam URL parsing, and a complementary Flask web dashboard. '
'All active processes persist to MySQL and recover on startup.'
),
'version': '1.x',
'status': 'Active',
'technologies': ['Python', 'Discord.py', 'Flask', 'MySQL', 'aiohttp'],
'features': [
'Advanced Moderation: warnings, temp mutes, role restoration, detailed logs',
'Persistent Giveaways: UUID IDs, sponsor attribution, Steam URL parsing',
'Web Dashboard: Flask templates for admins and users',
'Reliability: restart-safe process recovery from MySQL',
'Clean UX: rich embeds, buttons, clear admin feedback'
],
'commands': [
{ 'command': '!warn/@warn', 'description': 'Issue a warning with audit trail', 'permission': 'Moderator' },
{ 'command': '!mute/@mute <time>', 'description': 'Temporary mute with auto-unmute and role restore', 'permission': 'Moderator' },
{ 'command': '!giveaway start ...', 'description': 'Start a giveaway with title/prize/duration/sponsor', 'permission': 'Admin' },
{ 'command': '!giveaway edit <uuid> ...', 'description': 'Edit and auto-update original giveaway message', 'permission': 'Admin' }
],
'links': {
'website': 'https://multus.devanturas.net/'
},
'installation': [
'Create and configure MySQL database',
'Set Discord token and DB credentials as environment variables',
'Install Python dependencies',
'Run the bot and (optionally) the Flask dashboard'
]
}
return render_template('project_detail.html', project=project)
@app.route('/projects/itemeditor/storage', methods=['POST'])
def store_command():
"""Store a command and return UUID link"""
cleanup_expired_commands()
@app.route('/projects/discord-bot-stable-diffusion-amd')
def discord_bot_stable_diffusion_amd():
"""Detailed page for Discord Bot — Stable Diffusion (AMD)"""
project = {
'name': 'Discord Bot — Stable Diffusion (AMD)',
'tagline': 'AI image generation for AMD GPUs',
'description': 'Discord bot integrating Stable Diffusion image generation optimized for AMD GPUs with prompt-based commands.',
'long_description': (
'This project provides AI-powered text-to-image generation via Discord commands, with support optimized for AMD GPUs. '
'It focuses on reliable job handling, clean user experience, and practical configuration.'
),
'version': 'Latest',
'status': 'Active',
'technologies': ['Python', 'Discord.py', 'AI'],
'features': [
'Prompt-based image generation via slash or text commands',
'Optimized for AMD GPUs',
'Async processing and job queueing',
'Configurable parameters (model/prompt settings)'
],
'commands': [
{ 'command': '/sd generate <prompt>', 'description': 'Generate an image from a text prompt', 'permission': 'User' },
{ 'command': '/sd settings ...', 'description': 'View or adjust generation settings', 'permission': 'User' }
],
'links': {
'github': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD',
'issues': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD/issues'
},
'installation': [
'Install Python 3.10+',
'Set up required AI dependencies for AMD GPU support',
'Configure Discord token and model settings',
'Run the bot and test with a simple prompt'
]
}
return render_template('project_detail.html', project=project)
try:
data = request.get_json()
command = data.get('command', '').strip()
if not command:
return jsonify({'success': False, 'error': 'Command is required'}), 400
if len(command) > 10000:
return jsonify({'success': False, 'error': 'Command exceeds maximum length of 10,000 characters'}), 400
# Generate UUID
command_uuid = str(uuid.uuid4())
# Calculate expiry (30 minutes) - use UTC
created_at = datetime.now(timezone.utc)
expires_at = created_at + timedelta(minutes=30)
# Prepare data
command_data = {
'command': command,
'created_at': created_at.isoformat(),
'expires_at': expires_at.isoformat()
}
# Store to file
storage_file = STORAGE_DIR / f'{command_uuid}.json'
with storage_lock:
with open(storage_file, 'w', encoding='utf-8') as f:
json.dump(command_data, f)
# Generate URL - use HTTPS if behind proxy
scheme = request.headers.get('X-Forwarded-Proto', 'https' if request.is_secure else 'http')
host = request.headers.get('X-Forwarded-Host', request.host)
retrieval_url = f"{scheme}://{host}/projects/itemeditor/storage/{command_uuid}"
return jsonify({
'success': True,
'uuid': command_uuid,
'url': retrieval_url,
'expires_at': expires_at.isoformat()
}), 201
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 500
@app.route('/projects/itemeditor/storage/<command_uuid>')
def retrieve_command(command_uuid):
"""Retrieve stored command by UUID (JSON response for plugin)"""
cleanup_expired_commands()
storage_file = STORAGE_DIR / f'{command_uuid}.json'
if not storage_file.exists():
return jsonify({'error': 'Command not found or expired'}), 404
try:
with open(storage_file, 'r', encoding='utf-8') as f:
command_data = json.load(f)
# Check if expired
if datetime.fromisoformat(command_data['expires_at']) < datetime.now(timezone.utc):
storage_file.unlink()
return jsonify({'error': 'Command expired'}), 410
return jsonify(command_data), 200
except Exception as e:
return jsonify({'error': 'Failed to read command'}), 500
# Serve /versions as JSON
@app.route('/versions')
def versions():
return send_from_directory('versions', 'version.json', mimetype='application/json')
if __name__ == '__main__':
# Allow overriding via environment (e.g., Coolify sets PORT)

664
app_old.py Normal file
View File

@@ -0,0 +1,664 @@
import os
import json
from pathlib import Path
from flask import Flask, render_template, jsonify, send_from_directory
app = Flask(__name__)
# Load projects from version.json
def load_projects():
"""Load all projects from version.json"""
json_path = Path(__file__).parent / 'versions' / 'version.json'
with open(json_path, 'r', encoding='utf-8') as f:
return json.load(f)
def get_project_data(project_key, project_info):
"""Convert JSON project data to template format"""
# Determine project type and compatibility
project_type = project_info.get('project_type', 'minecraft')
# Get compatibility info
compat = None
if 'mc_compat' in project_info:
compat = project_info['mc_compat'].get('stable', '')
elif 'velocity_compat' in project_info:
compat = project_info['velocity_compat'].get('stable', '')
# Build project dict
return {
'id': project_key,
'name': project_info.get('name', project_key.title()),
'tagline': project_info.get('tagline', ''),
'type': project_type.title() + ' Plugin' if project_type in ['minecraft', 'velocity'] else 'Discord Bot',
'description': project_info.get('description', ''),
'long_description': project_info.get('long_description', ''),
'icon': project_info.get('icon', 'fas fa-cube'),
'color': project_type,
'status': project_info.get('status', {}).get('stable', 'active').title(),
'version': project_info.get('stable', 'N/A'),
'compatibility': compat,
'server_types': project_info.get('server_types', []),
'technologies': project_info.get('technologies', []),
'features': project_info.get('features', []),
'commands': project_info.get('commands', []),
'installation': project_info.get('installation', []),
'technical_highlights': project_info.get('technical_highlights', []),
'links': project_info.get('links', {}),
'downloads': project_info.get('stats', {}).get('downloads', 'Available'),
'users': None,
'url': f'/projects/{project_key}'
}
# Main routes
@app.route('/')
def home():
"""Homepage with overview of Devanturas and featured projects"""
projects = [
{
'name': 'Fly Plugin',
'type': 'Minecraft Plugin',
'description': 'Lightweight flight plugin for survival servers with configurable speeds and permissions.',
'technologies': ['Java', 'Spigot', 'Paper'],
'status': 'Active',
'url': '/projects/fly-plugin',
'icon': 'fas fa-paper-plane',
'color': 'minecraft'
},
{
'name': 'LevelCraft',
'type': 'Minecraft Plugin',
'description': 'Closed-source progression plugin with item leveling and augmentations.',
'technologies': ['Java', 'Spigot', 'Paper'],
'status': 'Active',
'url': '/projects/levelcraft',
'icon': 'fas fa-chart-line',
'color': 'minecraft'
},
{
'name': 'SimpleTeleport',
'type': 'Minecraft Plugin',
'description': 'Comprehensive teleportation plugin with homes, warps, spawn, and back commands.',
'technologies': ['Java', 'Spigot', 'Paper'],
'status': 'Active',
'url': '/projects/simpleteleport',
'icon': 'fas fa-location-arrow',
'color': 'minecraft'
},
{
'name': 'Hearts of Iron IV ELO Bot',
'type': 'Discord Bot',
'description': 'Sophisticated Discord bot with complete ELO rating system for HOI4 multiplayer communities.',
'technologies': ['Python', 'Discord.py', 'MySQL', 'Docker'],
'status': 'Production',
'url': '/projects/hoi4-elo-bot',
'icon': 'fab fa-discord',
'color': 'discord'
},
{
'name': 'Multus',
'type': 'Discord Bot',
'description': 'Production-ready moderation and restart-safe giveaways with a Flask web dashboard.',
'technologies': ['Python', 'Discord.py', 'Flask', 'MySQL'],
'status': 'Production',
'url': '/projects/discord-ai-bot',
'icon': 'fas fa-shield-alt',
'color': 'discord'
},
{
'name': 'Discord Bot — Stable Diffusion (AMD)',
'type': 'Discord Bot',
'description': 'AI image generation bot optimized for AMD GPUs with Discord commands and queueing.',
'technologies': ['Python', 'Discord.py', 'AI'],
'status': 'Paused',
'url': '/projects/discord-bot-stable-diffusion-amd',
'icon': 'fas fa-wand-magic-sparkles',
'color': 'discord'
}
]
return render_template('index.html', projects=projects)
@app.route('/projects')
def projects():
"""Overview of all projects"""
all_projects = [
{
'name': 'Fly Plugin',
'type': 'Minecraft Plugin',
'description': 'Simple flight for survival servers with speed control and permission management.',
'long_description': 'A lightweight, reliable Minecraft plugin that restores creative-like flying in survival mode. Designed for simplicity and performance.',
'technologies': ['Java', 'Spigot', 'Paper', 'Bukkit'],
'status': 'Active',
'version': '2.3',
'downloads': 'Available',
'url': '/projects/fly-plugin',
'icon': 'fas fa-paper-plane',
'color': 'minecraft',
'links': {
'hangar': 'https://hangar.papermc.io/SimolZimol/Flysystem',
'modrinth': 'https://modrinth.com/plugin/fly-simolzimol/',
'spigot': 'https://www.spigotmc.org/resources/fly.83164/'
}
},
{
'name': 'LevelCraft',
'type': 'Minecraft Plugin',
'description': 'Progression system introducing item leveling and augmentations.',
'long_description': 'LevelCraft adds a configurable progression system to Minecraft servers, including item-leveling mechanics and augmentation features to enhance gameplay and player goals.',
'technologies': ['Java', 'Spigot', 'Paper', 'Gradle'],
'status': 'Open Beta',
'version': 'Beta',
'url': '/projects/levelcraft',
'icon': 'fas fa-chart-line',
'color': 'minecraft',
'links': {}
},
{
'name': 'SimpleTeleport',
'type': 'Minecraft Plugin',
'description': 'Comprehensive teleportation plugin with homes, warps, spawn, and back commands.',
'long_description': 'SimpleTeleport provides essential teleportation features for Minecraft servers. Set homes, create warps, manage spawn points, and teleport back to previous locations with an intuitive command system.',
'technologies': ['Java', 'Spigot', 'Paper', 'Bukkit'],
'status': 'Active',
'version': '1.0',
'downloads': 'Available',
'url': '/projects/simpleteleport',
'icon': 'fas fa-location-arrow',
'color': 'minecraft',
'links': {
'hangar': 'https://hangar.papermc.io/SimolZimol/SimpleTeleport',
'spigot': 'https://www.spigotmc.org/resources/simpleteleport.130115/',
'modrinth': 'https://modrinth.com/plugin/simpleteleports'
}
},
{
'name': 'Hearts of Iron IV ELO Bot',
'type': 'Discord Bot',
'description': 'Advanced Discord bot for competitive HOI4 communities with ELO rating system.',
'long_description': 'A sophisticated Discord bot featuring a complete ELO rating system similar to chess rankings, designed specifically for Hearts of Iron IV multiplayer communities.',
'technologies': ['Python', 'Discord.py', 'MySQL', 'Docker', 'Coolify'],
'status': 'Production',
'version': '0.8',
'url': '/projects/hoi4-elo-bot',
'icon': 'fab fa-discord',
'color': 'discord',
'links': {
'discord': 'https://discord.gg/pU2tXP6tAE'
}
},
{
'name': 'Multus',
'type': 'Discord Bot',
'description': 'Production: moderation, restart-safe giveaways (Steam/Epic), and a web dashboard. Available only on Ludi et Historia Discord.',
'long_description': 'Multus is a production-ready Discord bot with advanced moderation, a persistent giveaway engine (Steam/Epic ready), a Flask-based dashboard, and restart safety via MySQL.',
'technologies': ['Python', 'Discord.py', 'Flask', 'MySQL', 'aiohttp'],
'status': 'Production',
'version': '1.x',
'url': '/projects/discord-ai-bot',
'icon': 'fas fa-shield-alt',
'color': 'discord',
'links': {
'website': 'https://multus.devanturas.net/'
}
},
{
'name': 'Discord Bot — Stable Diffusion (AMD)',
'type': 'Discord Bot',
'description': 'AI image generation with AMD GPUs, Discord commands, and job queuing.',
'long_description': 'A Discord bot for Stable Diffusion image generation optimized for AMD GPUs. Provides prompt-based generation through slash/text commands with async processing.',
'technologies': ['Python', 'Discord.py', 'AI'],
'status': 'Paused',
'version': 'dev-0.9.5',
'url': '/projects/discord-bot-stable-diffusion-amd',
'icon': 'fas fa-wand-magic-sparkles',
'color': 'discord',
'links': {
'github': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD',
'issues': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD/issues'
}
}
]
return render_template('projects.html', projects=all_projects)
@app.route('/minecraft')
def minecraft():
"""Dedicated Minecraft development page"""
minecraft_projects = [
{
'name': 'Fly Plugin',
'description': 'Flight plugin for survival servers',
'version': 'Latest',
'supported_versions': '1.15 - 1.21',
'downloads': 'Available',
'url': '/projects/fly-plugin'
},
{
'name': 'LevelCraft',
'description': 'Progression plugin with item leveling and augmentations',
'version': 'Beta',
'supported_versions': '1.21.x',
'downloads': 'Open Beta (Server)',
'url': '/projects/levelcraft'
},
{
'name': 'SimpleTeleport',
'description': 'Comprehensive teleportation with homes, warps, and spawn',
'version': '1.0',
'supported_versions': '1.19 - 1.21',
'downloads': 'Available',
'url': '/projects/simpleteleport'
}
]
minecraft_info = {
'experience': '7+ Years',
'preferred_apis': ['Spigot API', 'Paper API', 'Bukkit API'],
'specialties': ['Plugin Development', 'Server Optimization', 'Custom Commands', 'Permission Systems'],
'server_types': ['Spigot', 'Paper', 'Bukkit']
}
return render_template('minecraft.html', projects=minecraft_projects, info=minecraft_info)
@app.route('/about')
def about():
"""About SimolZimol and Devanturas"""
skills = {
'Minecraft Development': [
'Spigot & Paper Plugin Development',
'Java Programming',
'Server Administration',
'Performance Optimization',
'Custom Commands & GUIs',
'Permission System Integration'
],
'Discord Development': [
'Discord.py Bot Development',
'Database Integration (MySQL)',
'Asynchronous Programming',
'Community Management Tools',
'Slash Commands & Interactions',
'Docker Deployment'
],
'General Programming': [
'Java, Python',
'Database Design',
'RESTful APIs',
'Git Version Control',
'Docker & Containerization',
'Web Development (Flask)'
]
}
achievements = [
{
'title': 'Fly Plugin',
'description': 'Active on Modrinth & SpigotMC',
'icon': 'fas fa-download'
},
{
'title': 'Open Source',
'description': 'Contributing to GitHub repositories',
'icon': 'fab fa-github'
},
{
'title': 'Community',
'description': 'Supporting Discord communities',
'icon': 'fab fa-discord'
}
]
return render_template('about.html', skills=skills, achievements=achievements)
@app.route('/contact')
def contact():
"""Contact information and links"""
contact_links = [
{
'name': 'GitHub',
'url': 'https://github.com/SimolZimol/',
'description': 'Open source projects and code repositories',
'icon': 'fab fa-github',
'color': 'github'
},
{
'name': 'Discord',
'url': 'https://discordapp.com/users/253922739709018114',
'description': 'Direct contact for questions and support',
'icon': 'fab fa-discord',
'color': 'discord'
},
{
'name': 'Modrinth',
'url': 'https://modrinth.com/plugin/fly-simolzimol/',
'description': 'Fly Plugin on Modrinth platform',
'icon': 'fas fa-cube',
'color': 'modrinth'
},
{
'name': 'SpigotMC',
'url': 'https://www.spigotmc.org/resources/fly.83164/',
'description': 'Minecraft plugins and resources',
'icon': 'fas fa-plug',
'color': 'spigot'
}
]
return render_template('contact.html', links=contact_links)
# Healthcheck endpoint for platforms like Coolify
@app.route('/health')
def health():
return jsonify(status='ok'), 200
# Project detail pages
@app.route('/projects/fly-plugin')
def fly_plugin():
"""Detailed page for Fly Plugin"""
project = {
'name': 'Fly Plugin',
'tagline': 'Simple flight for survival servers',
'description': 'A lightweight, reliable Minecraft plugin that restores creative-like flying in survival mode. Designed to be simple for players and server admins.',
'long_description': '''Fly is a minimalist Minecraft plugin focused on providing reliable flight functionality for survival servers.
The plugin emphasizes simplicity, performance, and easy customization while maintaining compatibility across multiple server versions.''',
'version': '2.3',
'status': 'Active Support',
'compatibility': '1.15 - 1.21',
'server_types': ['Spigot', 'Paper', 'Bukkit'],
'technologies': ['Java', 'Spigot API', 'Paper API'],
'features': [
'Toggle flight for yourself: /fly',
'Toggle flight for others: /fly <player>',
'Adjustable flight speed: /fly speed <1-10>',
'Fully configurable messages and prefix',
'Live configuration reload: /flyreload',
'Permission-based access control',
'Lightweight and efficient'
],
'commands': [
{
'command': '/fly',
'description': 'Toggle your own flight',
'permission': 'fly.fly'
},
{
'command': '/fly <player>',
'description': 'Toggle another player\'s flight',
'permission': 'other.fly'
},
{
'command': '/fly speed <1-10>',
'description': 'Set your flight speed',
'permission': 'fly.speed'
},
{
'command': '/flyreload',
'description': 'Reload plugin configuration',
'permission': 'fly.reload'
}
],
'links': {
'hangar': 'https://hangar.papermc.io/SimolZimol/Flysystem',
'modrinth': 'https://modrinth.com/plugin/fly-simolzimol/',
'spigot': 'https://www.spigotmc.org/resources/fly.83164/'
},
'installation': [
'Download the latest JAR file',
'Place the JAR into your server plugins/ folder',
'Start the server to generate config.yml',
'Edit config.yml to customize messages and settings',
'Use /flyreload to apply changes without restart'
]
}
return render_template('project_detail.html', project=project)
@app.route('/projects/hoi4-elo-bot')
def hoi4_elo_bot():
"""Detailed page for HOI4 ELO Bot"""
project = {
'name': 'Hearts of Iron IV ELO Bot',
'tagline': 'Competitive ranking system for HOI4 communities',
'description': 'A sophisticated Discord bot designed specifically for Hearts of Iron IV multiplayer communities, featuring a complete ELO rating system similar to chess rankings.',
'long_description': '''This bot transforms casual gaming communities into structured competitive environments while maintaining
the fun and social aspects that make multiplayer gaming enjoyable. By providing objective performance metrics and historical tracking,
it helps players improve their skills and creates lasting engagement within gaming communities.''',
'version': '0.8',
'status': 'Live',
'technologies': ['Python', 'Discord.py 2.3.2', 'MySQL', 'Docker', 'Coolify'],
'features': [
'Dual Rating Modes: Standard and Competitive gameplay',
'Chess-like ELO Algorithm with HOI4 modifications',
'T-Level System: Country tier-based multipliers',
'Intelligent draw handling with ELO adjustments',
'Comprehensive player statistics and analytics',
'Match history and leaderboards',
'Hybrid slash and text commands',
'Docker containerization support'
],
'commands': [
{
'command': '/hoi4create <type> <name>',
'description': 'Create new match (standard/competitive)',
'permission': 'User'
},
{
'command': '/hoi4setup <game> <@user> <team> <t-level>',
'description': 'Add player to match',
'permission': 'User'
},
{
'command': '/hoi4end <game> <winner/draw>',
'description': 'Complete match and process ELO',
'permission': 'User'
},
{
'command': '/hoi4stats [@user]',
'description': 'View detailed player statistics',
'permission': 'User'
},
{
'command': '/hoi4leaderboard [type] [limit]',
'description': 'Display ranked player lists',
'permission': 'User'
}
],
'technical_highlights': [
'Asynchronous Programming with Discord.py',
'Normalized database schema with performance optimization',
'Implementation of proven ELO rating algorithms',
'Comprehensive error handling and logging',
'Docker deployment with Coolify integration'
],
'links': {
'discord': 'https://discord.gg/pU2tXP6tAE'
}
}
return render_template('project_detail.html', project=project)
@app.route('/projects/discord-ai-bot')
def discord_ai_bot():
"""Detailed page for Discord AI Bot — Moderation & Giveaways"""
project = {
'name': 'Multus',
'tagline': 'Moderation & Giveaways — Production-ready bot with a web dashboard',
'description': 'Multus provides advanced moderation, a persistent giveaway engine with Steam/Epic integration, and a Flask admin dashboard. Focused on reliability and UX.',
'long_description': (
'A production-ready Discord bot combining advanced moderation (warnings, temporary mutes with auto-restore), '
'a restart-safe giveaway system with UUID-based IDs and Steam URL parsing, and a complementary Flask web dashboard. '
'All active processes persist to MySQL and recover on startup.'
),
'version': 'dev-0.9.8',
'status': 'Production',
'technologies': ['Python', 'Discord.py', 'Flask', 'MySQL', 'aiohttp'],
'features': [
'Advanced Moderation: warnings, temp mutes, role restoration, detailed logs',
'Persistent Giveaways: UUID IDs, sponsor attribution, Steam URL parsing',
'Web Dashboard: Flask templates for admins and users',
'Reliability: restart-safe process recovery from MySQL',
'Clean UX: rich embeds, buttons, clear admin feedback',
'Available exclusively on Ludi et Historia Discord'
],
'commands': [
{ 'command': '!warn/@warn', 'description': 'Issue a warning with audit trail', 'permission': 'Moderator' },
{ 'command': '!mute/@mute <time>', 'description': 'Temporary mute with auto-unmute and role restore', 'permission': 'Moderator' },
{ 'command': '!giveaway start ...', 'description': 'Start a giveaway with title/prize/duration/sponsor', 'permission': 'Admin' },
{ 'command': '!giveaway edit <uuid> ...', 'description': 'Edit and auto-update original giveaway message', 'permission': 'Admin' }
],
'links': {
'website': 'https://multus.devanturas.net/'
},
'installation': [
'Create and configure MySQL database',
'Set Discord token and DB credentials as environment variables',
'Install Python dependencies',
'Run the bot and (optionally) the Flask dashboard'
]
}
return render_template('project_detail.html', project=project)
@app.route('/projects/discord-bot-stable-diffusion-amd')
def discord_bot_stable_diffusion_amd():
"""Detailed page for Discord Bot — Stable Diffusion (AMD)"""
project = {
'name': 'Discord Bot — Stable Diffusion (AMD)',
'tagline': 'AI image generation for AMD GPUs',
'description': 'Discord bot integrating Stable Diffusion image generation optimized for AMD GPUs with prompt-based commands.',
'long_description': (
'This project provides AI-powered text-to-image generation via Discord commands, with support optimized for AMD GPUs. '
'It focuses on reliable job handling, clean user experience, and practical configuration.'
),
'version': 'dev-0.9.5',
'status': 'Paused',
'technologies': ['Python', 'Discord.py', 'AI'],
'features': [
'Prompt-based image generation via slash or text commands',
'Optimized for AMD GPUs',
'Async processing and job queueing',
'Configurable parameters (model/prompt settings)'
],
'commands': [
{ 'command': '/sd generate <prompt>', 'description': 'Generate an image from a text prompt', 'permission': 'User' },
{ 'command': '/sd settings ...', 'description': 'View or adjust generation settings', 'permission': 'User' }
],
'links': {
'github': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD',
'issues': 'https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD/issues'
},
'installation': [
'Install Python 3.10+',
'Set up required AI dependencies for AMD GPU support',
'Configure Discord token and model settings',
'Run the bot and test with a simple prompt'
]
}
return render_template('project_detail.html', project=project)
@app.route('/projects/levelcraft')
def levelcraft():
"""Detailed page for LevelCraft (Closed Source)"""
project = {
'name': 'LevelCraft',
'tagline': 'Augmentations and Item Leveling for Minecraft',
'description': 'A closed-source progression plugin introducing item-leveling mechanics and augmentations to enhance gameplay loops.',
'long_description': (
'LevelCraft brings a configurable progression system to your Minecraft server. Players can level items over time, '
'apply augmentations, and pursue long-term goals while maintaining server performance and balance. '
'Built with Java and the Spigot/Paper APIs using a Gradle build setup.'
),
'version': 'Latest',
'status': 'Active Development',
'compatibility': '1.21.x',
'server_types': ['Spigot', 'Paper'],
'technologies': ['Java', 'Spigot API', 'Paper API', 'Gradle'],
'features': [
'Item leveling mechanics tied to gameplay progression',
'Augmentations to enhance items and gear',
'Configurable XP curves and progression settings',
'Permission-based access control',
'Efficient, production-ready design'
],
'commands': [],
'links': {},
'installation': [
'go on devanturas.net using mc 1.21.x'
]
}
return render_template('project_detail.html', project=project)
@app.route('/versions')
def versions():
from flask import send_from_directory
return send_from_directory('versions', 'version.json', mimetype='application/json')
@app.route('/projects/simpleteleport')
def simpleteleport():
"""Detailed page for SimpleTeleport"""
project = {
'name': 'SimpleTeleport',
'tagline': 'Complete teleportation solution for Minecraft servers',
'description': 'A comprehensive and lightweight teleportation plugin providing essential teleport features with an intuitive command system and full permission control.',
'long_description': (
'SimpleTeleport is designed to be lightweight and efficient while providing all essential teleportation features your server needs. '
'Set homes, create warps, manage spawn points, and teleport back to previous locations - all with extensive configuration options and customizable messages. '
'Perfect for survival servers, minigame servers, or any server that wants reliable teleportation without complexity.'
),
'version': '1.0',
'status': 'Active Support',
'compatibility': '1.19 - 1.21',
'server_types': ['Spigot', 'Paper', 'Bukkit'],
'technologies': ['Java', 'Spigot API', 'Paper API', 'Bukkit API'],
'features': [
'Complete home system with configurable limits per player',
'Server-wide warp system for public teleport points',
'Spawn management with first-join and death respawn options',
'Back command to return to your last location',
'Comprehensive permission system for fine-grained access control',
'Full configuration with customizable messages and placeholders',
'Color code support with & codes',
'YAML-based data storage for easy backup and transfer',
'Teleport delays with optional movement/damage cancellation',
'Economy integration support (Vault) with configurable costs',
'Command cooldowns to prevent spam'
],
'commands': [
{'command': '/sethome', 'description': 'Set your personal home location', 'permission': 'SimpleTeleport.sethome'},
{'command': '/home', 'description': 'Teleport to your home', 'permission': 'SimpleTeleport.home'},
{'command': '/home <player>', 'description': 'Teleport to another player\'s home', 'permission': 'SimpleTeleport.home.others'},
{'command': '/warp <name>', 'description': 'Teleport to a warp point', 'permission': 'SimpleTeleport.warp'},
{'command': '/setwarp <name>', 'description': 'Create a new warp point', 'permission': 'SimpleTeleport.setwarp'},
{'command': '/warps', 'description': 'List all available warps', 'permission': 'SimpleTeleport.warps'},
{'command': '/spawn', 'description': 'Teleport to the server spawn', 'permission': 'SimpleTeleport.spawn'},
{'command': '/spawn set', 'description': 'Set the server spawn location', 'permission': 'SimpleTeleport.setspawn'},
{'command': '/back', 'description': 'Teleport to your last location', 'permission': 'SimpleTeleport.back'}
],
'technical_highlights': [
'Configurable teleport delays with countdown messages',
'Optional cancellation on player movement or damage',
'Maximum homes per player with world restrictions',
'First-join and death respawn spawn options',
'Death location saving for /back command',
'Economy costs for homes, warps, and spawn (requires Vault)',
'Command cooldowns with configurable timers',
'Placeholder support: {player}, {warp}, {location}',
'Human-readable YAML data storage'
],
'links': {
'hangar': 'https://hangar.papermc.io/SimolZimol/SimpleTeleport',
'spigot': 'https://www.spigotmc.org/resources/simpleteleport.130115/',
'modrinth': 'https://modrinth.com/plugin/simpleteleports'
},
'installation': [
'Download the latest JAR from Hangar, Spigot, or Modrinth',
'Place the JAR into your server plugins/ folder',
'Start the server to generate config.yml and messages.yml',
'Configure settings in config.yml (teleport delays, home limits, etc.)',
'Customize messages in messages.yml with color codes',
'Reload the server or use /reload to apply changes'
]
}
return render_template('project_detail.html', project=project)
if __name__ == '__main__':
# Allow overriding via environment (e.g., Coolify sets PORT)
port = int(os.getenv('PORT', '5000'))
debug = os.getenv('FLASK_DEBUG', 'false').lower() == 'true'
app.run(debug=debug, host='0.0.0.0', port=port)
# Serve /versions as JSON

3
command_storage/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
# This directory stores temporary command data
# Files are automatically deleted after 30 minutes
*.json

View File

@@ -0,0 +1,128 @@
SimpleTeleport is a comprehensive and lightweight teleportation plugin that provides essential teleport features for your Minecraft server. Set homes, create warps, manage spawn points, and teleport back to previous locations - all with an intuitive command system and full permission control.
**What's Included in Version 1.0:**
- Complete home system allowing players to set and teleport to their personal homes
- Server-wide warp system for admins to create public teleport points
- Spawn management with customizable spawn behavior
- Back command to return to your last location
- Comprehensive permission system for fine-grained access control
- Full configuration system with customizable messages
- Color code support with & codes
- Placeholder support for dynamic messages ({player}, {warp}, {location})
- YAML-based data storage for homes, warps, and spawn
- Clean and organized file structure
**Commands:**
/sethome - Set your personal home location
/home - Teleport to your home
/home <player> - Teleport to another player's home (requires permission)
/warp <name> - Teleport to a warp point
/setwarp <name> - Create a new warp point
/warps - List all available warps
/spawn - Teleport to the server spawn
/spawn set - Set the server spawn location
/back - Teleport to your last location
**Permissions:**
SimpleTeleport.* - Access to all plugin commands
SimpleTeleport.sethome - Allows setting your home
SimpleTeleport.home - Allows teleporting to your home
SimpleTeleport.home.others - Allows teleporting to other players' homes
SimpleTeleport.warp - Allows using warps
SimpleTeleport.setwarp - Allows creating warps
SimpleTeleport.warps - Allows listing warps
SimpleTeleport.spawn - Allows teleporting to spawn
SimpleTeleport.setspawn - Allows setting the spawn point
SimpleTeleport.back - Allows using the back command
**Configuration Options (config.yml):**
```
teleportation:
delay: 3 # Teleport delay in seconds
cancel-on-move: true # Cancel teleport if player moves
cancel-on-damage: true # Cancel teleport if player takes damage
countdown-messages: true # Show countdown messages
homes:
max-homes: 1 # Maximum homes per player (-1 for unlimited)
allowed-worlds: [] # Restrict homes to specific worlds
spawn:
teleport-on-first-join: false # Teleport new players to spawn
teleport-on-death: false # Teleport players to spawn on death
back:
save-location-on-death: true # Save death location for /back
economy:
enabled: false # Enable economy features (requires Vault)
home-set-cost: 0.0
home-teleport-cost: 0.0
warp-cost: 0.0
cooldowns:
enabled: false # Enable command cooldowns
home: 60
warp: 30
spawn: 30
back: 120
```
**Message Customization (messages.yml):**
```
prefix: "&8[&6SimpleTeleport&8]&r "
home-set: "&aHome successfully set!"
home-teleport: "&aTeleported to your home!"
warp-teleport: "&aTeleported to warp &6{warp}&a!"
spawn-teleport: "&aTeleported to spawn!"
back-teleport: "&aTeleported to your last location!"
```
**Features in Detail:**
**Home System:**
- Players can set their personal home location
- Configurable maximum number of homes per player
- Option to restrict home setting to specific worlds
- Teleport to other players' homes with proper permissions
**Warp System:**
- Admins create public warp points accessible to all players
- Easy-to-use warp list command
- Prevents duplicate warp names
- Supports warps across different worlds
**Spawn Management:**
- Set a global spawn point for the server
- Optional teleportation to spawn on first join
- Optional respawn at spawn instead of bed
- Simple /spawn command for quick access
**Back Command:**
- Remembers your last location before teleportation
- Optional saving of death locations
- Configurable to remember multiple previous locations
- Works after any teleport command
**Data Storage:**
- All data stored in YAML format
- Separate files for homes, warps, and spawn
- Easy to backup and transfer
- Human-readable and editable
**Supported Minecraft Versions:**
1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.4, 1.20.6, 1.21
The plugin is designed to be lightweight and efficient while providing all essential teleportation features your server needs. Perfect for survival servers, minigame servers, or any server that wants reliable teleportation without complexity.
**Planned Features for Future Updates:**
- Economy integration with configurable costs
- Command cooldowns to prevent spam
- Multiple homes per player with named homes
- Warp categories and GUI
- Teleport request system (/tpa)
- Random teleport feature
- Warmup countdown with action bar messages
Just send me a message on Discord if you have any questions, suggestions, or requests for new features!

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
static/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -42,6 +42,9 @@ a:hover { color: #66e6ff; }
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0,212,255,.4); }
.btn-secondary { background: transparent; color:#fff; border: 2px solid #333; }
.btn-secondary:hover { background:#333; transform: translateY(-2px); }
.btn-outline { background: transparent; color:#00d4ff; border: 2px solid #00d4ff; }
.btn-outline:hover { background: rgba(0,212,255,0.1); transform: translateY(-2px); }
.btn i { font-size: 0.95rem; }
.hero-background { position:absolute; inset:0; z-index:1; }
.floating-icons { position:absolute; width:100%; height:100%; }
@@ -97,6 +100,20 @@ section { scroll-margin-top: 80px; }
.stat-item { background:#141414; border:1px solid #222; border-radius:12px; padding: 1.25rem; text-align:center; }
.stat-number { font-size:1.4rem; color:#00d4ff; font-weight:800; }
.stat-label { color:#a7a7a7; font-size:.9rem; }
/* Community Section */
.community-section { padding: 80px 0; background:#0a0a1a; }
.community-section h2 { color:#fff; text-align:center; margin-bottom:.5rem; }
.community-section .section-subtitle { text-align:center; color:#9b9b9b; margin-bottom:2.5rem; }
.community-content { display:grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap:2rem; }
.community-card { background:rgba(255,255,255,0.03); border:1px solid rgba(0,212,255,0.2); border-radius:16px; padding:2rem; }
.community-icon { width:60px; height:60px; border-radius:12px; background:linear-gradient(135deg, #ff0000 0%, #cc0000 100%); display:flex; align-items:center; justify-content:center; font-size:1.75rem; color:#fff; margin-bottom:1rem; }
.community-card h3 { color:#fff; font-size:1.4rem; margin-bottom:.5rem; }
.timeline-badge { color:#00d4ff; font-size:.9rem; font-weight:600; margin-bottom:.75rem; display:inline-block; }
.community-card p { color:#e0e0e0; line-height:1.7; margin-bottom:.75rem; }
.community-card a { color:#00d4ff; text-decoration:none; transition:color 0.3s ease; }
.community-card a:hover { color:#00a8e6; text-decoration:underline; }
.cta { padding: 80px 0; background: linear-gradient(135deg,#0c0c0c,#121a24); }
.cta-content { text-align:center; }
.cta h2 { color:#fff; font-size:2rem; margin-bottom:.5rem; }
@@ -114,7 +131,17 @@ section { scroll-margin-top: 80px; }
.filter-btn.active { background: rgba(0,212,255,.1); color:#00d4ff; border-color: rgba(0,212,255,.3); }
.project-description { color:#cfcfcf; }
.project-technologies { display:flex; flex-wrap:wrap; gap:.5rem; margin: .75rem 0; }
.project-stats { display:flex; gap:1.25rem; margin: .5rem 0 .75rem; }
.project-stats { display:flex; gap:1rem; margin: .75rem 0 1rem; flex-wrap:wrap; }
.project-stats .stat { background:#141414; border:1px solid #242424; border-radius:8px; padding:.5rem .75rem; min-width:90px; }
.project-stats .stat-label { color:#9a9a9a; font-size:.75rem; display:block; }
.project-stats .stat-value { color:#fff; font-weight:600; font-size:.95rem; display:block; margin-top:.1rem; }
/* Project Status Colors */
.status-stable { color:#00ffa6 !important; }
.status-beta { color:#ffaa00 !important; }
.status-development, .status-dev { color:#ff9500 !important; }
.status-active { color:#00d4ff !important; }
.status-paused { color:#999 !important; }
.stat .stat-label { color:#9a9a9a; font-size:.78rem; }
.stat .stat-value { color:#eaeaea; font-weight:700; }
.project-actions { display:flex; gap:.6rem; flex-wrap:wrap; margin-top:.5rem; }
@@ -127,11 +154,12 @@ section { scroll-margin-top: 80px; }
.project-hero-text h1 { color:#fff; font-size:2.2rem; }
.project-tagline { color:#aeb; margin:.25rem 0 .5rem; }
.project-description { color:#cfcfcf; }
.project-hero-stats { display:flex; gap:1rem; margin: 1rem 0; }
.hero-stat { background:#141414; border:1px solid #242424; border-radius:10px; padding:.6rem .8rem; }
.hero-stat .stat-label { color:#9a9a9a; font-size:.8rem; }
.hero-stat .stat-value { color:#fff; font-weight:700; }
.project-hero-actions { display:flex; gap:.6rem; flex-wrap:wrap; }
.project-hero-stats { display:flex; gap:1rem; margin: 1.5rem 0; flex-wrap:wrap; }
.hero-stat { background:#141414; border:1px solid #242424; border-radius:10px; padding:.75rem 1rem; min-width: 120px; }
.hero-stat .stat-label { color:#9a9a9a; font-size:.82rem; display:block; margin-bottom:.15rem; }
.hero-stat .stat-value { color:#fff; font-weight:700; font-size:1.05rem; display:block; }
.project-hero-actions { display:flex; gap:.8rem; flex-wrap:wrap; margin-top: 1.5rem; align-items:center; }
.project-hero-actions .btn { white-space: nowrap; }
.project-hero-visual { display:flex; justify-content:center; }
.project-icon-large { width:120px; height:120px; border-radius:24px; background: linear-gradient(135deg,#1d2a31,#0d1a21); color:#00d4ff; display:flex; align-items:center; justify-content:center; font-size:3rem; border:1px solid #1e2a33; }
@@ -248,58 +276,75 @@ section { scroll-margin-top: 80px; }
.minecraft-cta p { color:#bdbdbd; }
/* About Page */
.about-hero { padding: 110px 0 40px; background:#0f0f0f; border-bottom:1px solid #1f1f1f; }
.about-hero { padding: 110px 0 40px; background: linear-gradient(135deg, #0a0a1a 0%, #1a1a2e 100%); border-bottom:1px solid rgba(0, 212, 255, 0.2); }
.about-hero-content { display:grid; grid-template-columns: 1.2fr .8fr; gap: 1.5rem; align-items:center; }
.about-text h1 { color:#fff; font-size:2.2rem; }
.about-subtitle { color:#a9b; margin:.25rem 0 .75rem; }
.code-showcase { background:#1a1a1a; border:1px solid #252525; border-radius: 12px; overflow:hidden; }
.about-subtitle { color:#00d4ff; margin:.25rem 0 .75rem; font-weight: 500; }
.about-text p { color: #e0e0e0; line-height: 1.7; }
.about-text a { color:#00d4ff; text-decoration: none; transition: color 0.3s ease; }
.about-text a:hover { color:#00a8e6; text-decoration: underline; }
.code-showcase { background:#1a1a1a; border:1px solid rgba(0, 212, 255, 0.2); border-radius: 12px; overflow:hidden; box-shadow: 0 5px 20px rgba(0, 212, 255, 0.1); }
.code-header { background:#2d2d2d; padding:.6rem .8rem; display:flex; justify-content:space-between; align-items:center; }
.code-title { color:#fff; font-size:.9rem; }
.code-title { color:#00d4ff; font-size:.9rem; font-weight: 600; }
.code-buttons { display:flex; gap:.4rem; }
.code-buttons span { width:12px; height:12px; border-radius:50%; background:#555; }
.code-buttons span:nth-child(1){ background:#ff5f56; }
.code-buttons span:nth-child(2){ background:#ffbd2e; }
.code-buttons span:nth-child(3){ background:#27ca3f; }
.code-content { padding: .8rem; }
.code-content pre { color:#ccc; font-family: 'Courier New', monospace; font-size:.85rem; line-height:1.45; overflow:auto; }
.code-content pre { color:#e0e0e0; font-family: 'Courier New', monospace; font-size:.85rem; line-height:1.45; overflow:auto; }
.skills-section { padding: 60px 0; }
.skills-section { padding: 60px 0; background: #0f0f1f; }
.skills-section h2 { color:#fff; text-align:center; margin-bottom: 1rem; }
.skills-section .skills-grid { display:grid; grid-template-columns: repeat(auto-fit,minmax(260px,1fr)); gap: 1rem; }
.skill-category { background:#121212; border:1px solid #232323; border-radius:12px; padding:1rem; }
.skill-category h3 { color:#fff; margin-bottom:.5rem; }
.skill-category { background:rgba(255, 255, 255, 0.03); border:1px solid rgba(0, 212, 255, 0.2); border-radius:12px; padding:1rem; transition: all 0.3s ease; }
.skill-category:hover { background:rgba(255, 255, 255, 0.05); border-color: rgba(0, 212, 255, 0.4); transform: translateY(-3px); }
.skill-category h3 { color:#00d4ff; margin-bottom:.5rem; font-weight: 600; }
.skills-list { display:flex; flex-direction:column; gap:.35rem; }
.skill-item { display:flex; gap:.5rem; color:#cfcfcf; }
.skill-item { display:flex; gap:.5rem; color:#e0e0e0; }
.skill-item i { color:#00d4ff; }
.experience-section { padding: 60px 0; }
.experience-section { padding: 60px 0; background: #0a0a1a; }
.experience-section h2 { color:#fff; text-align:center; margin-bottom: 2rem; }
.timeline { display:flex; flex-direction:column; gap:1rem; }
.timeline-item { display:flex; gap:.8rem; }
.timeline-marker { width:12px; height:12px; border-radius:50%; background:#00d4ff; margin-top:.4rem; }
.timeline-content { background:#121212; border:1px solid #232323; border-radius:12px; padding:.8rem 1rem; flex:1; }
.timeline-content h3 { color:#fff; margin-bottom:.25rem; }
.timeline-content p { color:#bdbdbd; }
.timeline-date { color:#9a9a9a; font-size:.85rem; }
.timeline-marker { width:12px; height:12px; border-radius:50%; background:#00d4ff; margin-top:.4rem; box-shadow: 0 0 10px rgba(0, 212, 255, 0.5); }
.timeline-marker.active { background: linear-gradient(135deg, #00d4ff 0%, #8a2be2 100%); box-shadow: 0 0 15px rgba(0, 212, 255, 0.8); }
.timeline-content { background:rgba(255, 255, 255, 0.03); border:1px solid rgba(0, 212, 255, 0.2); border-radius:12px; padding:.8rem 1rem; flex:1; transition: all 0.3s ease; }
.timeline-content:hover { background:rgba(255, 255, 255, 0.05); border-color: rgba(0, 212, 255, 0.4); }
.timeline-content h3 { color:#fff; margin-bottom:.25rem; font-weight: 600; }
.timeline-content p { color:#e0e0e0; }
.timeline-date { color:#00d4ff; font-size:.85rem; font-weight: 500; }
.achievements-section { padding: 60px 0; }
.achievements-section { padding: 60px 0; background: #0f0f1f; }
.achievements-section h2 { color:#fff; text-align:center; margin-bottom: 2rem; }
.achievements-grid { display:grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); gap: 1rem; }
.achievement-card { background:#121212; border:1px solid #232323; border-radius:12px; padding: 1rem; text-align:center; }
.achievement-card { background:rgba(255, 255, 255, 0.03); border:1px solid rgba(0, 212, 255, 0.2); border-radius:12px; padding: 1rem; text-align:center; transition: all 0.3s ease; }
.achievement-card:hover { background:rgba(255, 255, 255, 0.05); border-color: rgba(0, 212, 255, 0.4); transform: translateY(-5px); box-shadow: 0 5px 20px rgba(0, 212, 255, 0.2); }
.achievement-icon { color:#00d4ff; font-size:1.6rem; margin-bottom:.4rem; }
.achievement-card h3 { color:#fff; }
.achievement-card p { color:#bdbdbd; }
.achievement-card h3 { color:#fff; margin-bottom: 0.5rem; }
.achievement-card p { color:#e0e0e0; }
.philosophy-section { padding: 60px 0; }
.philosophy-section { padding: 60px 0; background: #0a0a1a; }
.philosophy-section h2 { color:#fff; text-align:center; margin-bottom: 2rem; }
.philosophy-grid { display:grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); gap:1rem; }
.philosophy-item { background:#121212; border:1px solid #232323; border-radius:12px; padding:1rem; text-align:center; }
.philosophy-item { background:rgba(255, 255, 255, 0.03); border:1px solid rgba(0, 212, 255, 0.2); border-radius:12px; padding:1rem; text-align:center; transition: all 0.3s ease; }
.philosophy-item:hover { background:rgba(255, 255, 255, 0.05); border-color: rgba(0, 212, 255, 0.4); transform: translateY(-3px); }
.philosophy-icon { color:#00d4ff; font-size:1.6rem; margin-bottom:.4rem; }
.philosophy-item h3 { color:#fff; margin-bottom: 0.5rem; }
.philosophy-item p { color:#e0e0e0; }
.interests-section { padding: 60px 0; }
.interests-section { padding: 60px 0; background: #0f0f1f; }
.interests-section h2 { color:#fff; text-align:center; margin-bottom: 2rem; }
.interests-text p { color: #e0e0e0; line-height: 1.7; margin-bottom: 1.5rem; }
.interests-list { display:grid; grid-template-columns: repeat(auto-fit,minmax(220px,1fr)); gap:.8rem; margin-top:.6rem; }
.interest-item { background:#121212; border:1px solid #232323; border-radius:12px; padding:.8rem; display:flex; gap:.6rem; align-items:center; }
.interest-item { background:rgba(255, 255, 255, 0.03); border:1px solid rgba(0, 212, 255, 0.2); border-radius:12px; padding:.8rem; display:flex; gap:.6rem; align-items:center; transition: all 0.3s ease; color: #e0e0e0; }
.interest-item:hover { background:rgba(255, 255, 255, 0.05); border-color: rgba(0, 212, 255, 0.4); }
.interest-item i { color:#00d4ff; font-size: 1.2rem; }
.about-cta { padding: 60px 0; text-align:center; background: linear-gradient(135deg,#0c0c0c,#121a24); }
.about-cta h2 { color:#fff; }
.about-cta p { color:#bdbdbd; margin-bottom:1rem; }
.about-cta { padding: 60px 0; text-align:center; background: linear-gradient(135deg, rgba(0, 212, 255, 0.1) 0%, rgba(138, 43, 226, 0.1) 100%); border-top: 1px solid rgba(0, 212, 255, 0.3); }
.about-cta h2 { color:#fff; margin-bottom: 1rem; }
.about-cta p { color:#e0e0e0; margin-bottom:1.5rem; font-size: 1.1rem; }
/* Contact Page */
.contact-hero { padding: 110px 0 40px; background:#0f0f0f; border-bottom:1px solid #1f1f1f; text-align:center; }

BIN
static/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

BIN
static/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

1
static/site.webmanifest Normal file
View File

@@ -0,0 +1 @@
{"name":"Devanturas by SimolZimol","short_name":"Devanturas","icons":[{"src":"/static/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/static/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#1a1a2e","background_color":"#0f0f1a","display":"standalone"}

View File

@@ -11,7 +11,7 @@
<div class="about-text">
<h1>About SimolZimol</h1>
<p class="about-subtitle">Passionate developer specializing in Minecraft plugins and Discord bots</p>
<p>Welcome to Devanturas! I'm a dedicated software developer with a focus on creating high-quality Minecraft plugins and Discord applications. My journey in programming has led me to specialize in Java and Python development, with particular expertise in server-side applications and community management tools.</p>
<p>Welcome to Devanturas! I'm a dedicated software developer with a focus on creating high-quality Minecraft plugins and Discord applications. Since 2017, I've been developing Minecraft plugins, with my first public release in 2020. Alongside plugin development, I've been working on <a href="https://multus.devanturas.net/" target="_blank" style="color: #00d4ff;">Multus</a>, a sophisticated Discord bot that has been in active development since 2020 and is actively used on the Ludi et Historia Discord server.</p>
</div>
<div class="about-visual">
<div class="code-showcase">
@@ -79,43 +79,52 @@
<div class="timeline-content">
<h3>Started Minecraft Development</h3>
<p>Began learning Java and Spigot API development, creating first plugins for personal servers and friends.</p>
<span class="timeline-date">2021</span>
<span class="timeline-date">2017</span>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<h3>First Public Plugin Release</h3>
<p>Released Fly Plugin on SpigotMC, focusing on clean code, performance, and user-friendly configuration.</p>
<span class="timeline-date">2022</span>
<h3>Discord Bot Development & First Public Plugin</h3>
<p>Released Fly Plugin on SpigotMC and started developing Multus, a sophisticated Discord bot for the Ludi et Historia community.</p>
<span class="timeline-date">2020</span>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<h3>Discord Bot Development</h3>
<p>Expanded into Python and Discord.py, creating sophisticated bots with database integration and complex algorithms.</p>
<span class="timeline-date">2023</span>
<h3>AI Integration & Image Generation</h3>
<p>Developed <a href="https://github.com/SimolZimol/Discord-Bot-stable-diffusion-AMD" target="_blank" style="color: #00d4ff;">Stable Diffusion integration</a> for Discord bots and added AI features to Multus.</p>
<span class="timeline-date">2022-2023</span>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<h3>Advanced Projects & Community</h3>
<p>Developed complex systems like HOI4 ELO Bot, gained experience with Docker, and expanded platform presence.</p>
<h3>Web Panel & Docker Infrastructure</h3>
<p>Added web panel to Multus and began migrating non-Minecraft projects to Docker-based infrastructure for better deployment.</p>
<span class="timeline-date">2024</span>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<h3>Platform Expansion & Giveaway System</h3>
<p>Created Modrinth and Hangar accounts to publish more Minecraft plugins. Added comprehensive giveaway system to Multus.</p>
<span class="timeline-date">2025</span>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker active"></div>
<div class="timeline-content">
<h3>Continuous Innovation</h3>
<p>Currently working on new projects, exploring modern technologies, and contributing to the development community.</p>
<span class="timeline-date">2025</span>
<p>Currently working on Velocity Friends, Item Editor, and continuously improving Multus with new features and optimizations.</p>
<span class="timeline-date">2026</span>
</div>
</div>
</div>

View File

@@ -5,6 +5,14 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Devanturas by SimolZimol - Professional Minecraft & Discord Development{% endblock %}</title>
<meta name="description" content="{% block description %}Devanturas - Professional Minecraft Plugin Development and Discord Bot Programming by SimolZimol{% endblock %}">
<!-- Favicons -->
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16x16.png') }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32x32.png') }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='apple-touch-icon.png') }}">
<link rel="manifest" href="{{ url_for('static', filename='site.webmanifest') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
{% block extra_head %}{% endblock %}
@@ -60,7 +68,7 @@
</div>
</div>
<div class="footer-bottom">
<p>&copy; 2025 Devanturas by SimolZimol. All rights reserved.</p>
<p>&copy; 2018-2026 Devanturas by SimolZimol. All rights reserved.</p>
</div>
</div>
</footer>

View File

@@ -76,7 +76,7 @@
<i class="fas fa-cube"></i>
</div>
<h3>Minecraft Development</h3>
<p>Professional plugin development for Spigot, Paper, and Bukkit servers with focus on performance and user experience.</p>
<p>Professional plugin development since 2017 for Velocity, Spigot, Paper, and Bukkit servers with focus on performance and user experience.</p>
<ul>
<li>Java Programming</li>
<li>Spigot/Paper API</li>
@@ -90,11 +90,11 @@
<i class="fab fa-discord"></i>
</div>
<h3>Discord Bot Development</h3>
<p>Advanced Discord bots with database integration, complex algorithms, and community management features.</p>
<p>Advanced Discord bots since 2020 with database integration, AI features, web panels, and community management. Creator of Multus bot for Ludi et Historia.</p>
<ul>
<li>Python & Discord.py</li>
<li>Database Integration</li>
<li>Async Programming</li>
<li>Database & Web Panels</li>
<li>AI Integration (Stable Diffusion)</li>
<li>Docker Deployment</li>
</ul>
</div>
@@ -121,11 +121,11 @@
<div class="container">
<div class="stats-grid">
<div class="stat-item">
<div class="stat-number">3+</div>
<div class="stat-number">9+</div>
<div class="stat-label">Years Experience</div>
</div>
<div class="stat-item">
<div class="stat-number">2</div>
<div class="stat-number">4+</div>
<div class="stat-label">Active Projects</div>
</div>
<div class="stat-item">
@@ -140,12 +140,39 @@
</div>
</section>
<!-- Server Hosting & Sponsoring Section -->
<section id="hosting" class="community-section">
<div class="container">
<h2>Server Hosting & Sponsoring</h2>
<p class="section-subtitle">Long-term partnerships with gaming communities</p>
<div class="community-content">
<div class="community-card">
<div class="community-icon">
<i class="fab fa-youtube"></i>
</div>
<h3>Ludi et Historia Partnership</h3>
<p class="timeline-badge">Since August 2020</p>
<p>Dedicated Minecraft server infrastructure and custom plugin development for <a href="https://youtube.fandom.com/wiki/Ludi_et_Historia" target="_blank" style="color: #00d4ff;">Ludi et Historia</a>, a gaming YouTube channel. Providing reliable hosting and technical support for their community.</p>
</div>
<div class="community-card">
<div class="community-icon">
<i class="fas fa-handshake"></i>
</div>
<h3>Content Creator Support</h3>
<p>Working with content creators and gaming communities to provide server infrastructure, custom plugin solutions, and ongoing technical support. If you're interested in collaboration, feel free to reach out.</p>
</div>
</div>
</div>
</section>
<!-- Call to Action Section -->
<section id="cta" class="cta">
<div class="container">
<div class="cta-content">
<h2>Ready to Collaborate?</h2>
<p>Whether you need a custom Minecraft plugin, Discord bot, or full-stack solution, I'm here to help bring your ideas to life.</p>
<p>Whether you have a project idea, need custom plugin development, or want to discuss technical solutions, feel free to get in touch.</p>
<div class="cta-buttons">
<a href="{{ url_for('contact') }}" class="btn btn-primary">Get In Touch</a>
<a href="{{ url_for('minecraft') }}" class="btn btn-secondary">Explore Minecraft Projects</a>

View File

@@ -0,0 +1,752 @@
{% extends "base.html" %}
{% block title %}Item Editor - Command Storage - Devanturas{% endblock %}
{% block description %}Store commands longer than 256 characters temporarily for Minecraft Item Editor plugin{% endblock %}
{% block content %}
<section class="page-header">
<div class="container">
<div class="project-breadcrumb">
<a href="{{ url_for('projects') }}">Projects</a> / Item Editor / Command Storage
</div>
<h1>Item Editor Command Storage</h1>
<p>Store long commands (>256 chars) temporarily and generate a retrievable link</p>
</div>
</section>
<section class="command-storage-section">
<div class="container">
<div class="storage-grid">
<!-- Left: Command Input -->
<div class="storage-card">
<div class="card-header">
<i class="fas fa-terminal"></i>
<h2>Store Command</h2>
</div>
<p class="card-description">
Paste your Minecraft command below. Commands longer than 256 characters will be stored
for 30 minutes and a unique retrieval link will be generated.
</p>
<form id="commandForm">
<div class="form-group">
<label for="command">Minecraft Command</label>
<textarea
id="command"
name="command"
rows="6"
placeholder="Paste your command here..."
required
></textarea>
<div class="char-counter">
<span id="charCount">0</span> characters
<span id="charStatus"></span>
</div>
</div>
<button type="submit" class="btn btn-primary" id="submitBtn">
<i class="fas fa-save"></i> Store Command
</button>
</form>
<!-- Available Placeholders Section (moved here) -->
<div class="info-card" style="margin-top:2.5rem;">
<div class="info-icon">
<i class="fas fa-percent"></i>
</div>
<h3>Available Placeholders</h3>
<ul class="info-list">
<li><code>%player%</code> Name of the player using the item</li>
<li><code>%target%</code> Name of the target player</li>
<li><code>%x%</code> Block X coordinate of the player</li>
<li><code>%y%</code> Block Y coordinate of the player</li>
<li><code>%z%</code> Block Z coordinate of the player</li>
</ul>
</div>
<!-- Success Message -->
<div id="successMessage" style="display: none;" class="success-box">
<div class="success-header">
<i class="fas fa-check-circle"></i>
<h3>Command Stored Successfully!</h3>
</div>
<p class="success-description">Your command has been stored for 30 minutes.</p>
<div class="link-display">
<label>Retrieval Link (JSON):</label>
<div class="link-box">
<input type="text" id="generatedLink" readonly>
<button class="btn btn-secondary btn-copy" onclick="copyLink()">
<i class="fas fa-copy"></i> Copy
</button>
</div>
<small>Use this link in your Item Editor plugin to load the command.</small>
</div>
<div class="expiry-info">
<i class="fas fa-clock"></i>
<span>Expires in: <strong id="expiryTime">30 minutes</strong></span>
</div>
<button class="btn btn-outline" onclick="resetForm()">
<i class="fas fa-plus"></i> Store Another Command
</button>
</div>
<!-- Recently Stored Commands Section -->
<div id="recentCommandsSection" class="recent-commands-section" style="margin-top:2.5rem;">
<h3 style="color:#00d4ff; margin-bottom:1rem;">Recently Stored Commands</h3>
<div id="recentCommandsList" class="recent-commands-list"></div>
</div>
</div>
<!-- Right: Info & Stats -->
<div class="info-sidebar">
<div class="info-card">
<div class="info-icon">
<i class="fas fa-info-circle"></i>
</div>
<h3>How It Works</h3>
<ol class="info-steps">
<li>Paste your long Minecraft command</li>
<li>Click "Store Command" to generate a link</li>
<li>Copy the generated JSON link</li>
<li>Use the link in your Item Editor plugin</li>
</ol>
</div>
<div class="info-card">
<div class="info-icon">
<i class="fas fa-shield-alt"></i>
</div>
<h3>Storage Limits</h3>
<ul class="info-list">
<li><i class="fas fa-check"></i> <strong>Duration:</strong> 30 minutes</li>
<li><i class="fas fa-check"></i> <strong>Max Length:</strong> 10,000 characters</li>
<li><i class="fas fa-check"></i> <strong>Format:</strong> JSON response</li>
<li><i class="fas fa-check"></i> <strong>Access:</strong> Anyone with link</li>
</ul>
</div>
<div class="info-card">
<div class="info-icon">
<i class="fas fa-server"></i>
</div>
<h3>Self-Hosting</h3>
<p class="code-description">Host this system on your own webserver with this simple PHP script:</p>
<pre class="code-block" style="font-size: 0.75rem; line-height: 1.4;">&lt;?php
header('Content-Type: application/json');
$storage_file = 'commands.json';
// Store command (POST)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = json_decode(file_get_contents('php://input'), true);
$command = $data['command'] ?? '';
if (strlen($command) > 10000) {
http_response_code(400);
echo json_encode(['error' => 'Too long']);
exit;
}
$uuid = bin2hex(random_bytes(16));
$expires = time() + 1800; // 30 min
$storage = file_exists($storage_file)
? json_decode(file_get_contents($storage_file), true)
: [];
$storage[$uuid] = [
'command' => $command,
'expires_at' => $expires
];
file_put_contents($storage_file, json_encode($storage));
echo json_encode([
'success' => true,
'url' => "https://yourserver.com/storage.php?id=$uuid"
]);
exit;
}
// Retrieve command (GET)
if (isset($_GET['id'])) {
$storage = file_exists($storage_file)
? json_decode(file_get_contents($storage_file), true)
: [];
$uuid = $_GET['id'];
if (!isset($storage[$uuid])) {
http_response_code(404);
echo json_encode(['error' => 'Not found']);
exit;
}
if ($storage[$uuid]['expires_at'] < time()) {
unset($storage[$uuid]);
file_put_contents($storage_file, json_encode($storage));
http_response_code(410);
echo json_encode(['error' => 'Expired']);
exit;
}
echo json_encode($storage[$uuid]);
exit;
}
?&gt;</pre>
<p style="color: #cfcfcf; font-size: 0.9rem; margin-top: 1rem;">
<strong>Setup:</strong> Save as <code>storage.php</code> on your webserver.
Make sure the directory is writable for <code>commands.json</code>.
</p>
</div>
</div>
</div>
</div>
</section>
<style>
.page-header {
padding: 110px 0 40px;
background: #0f0f0f;
border-bottom: 1px solid #1f1f1f;
}
.command-storage-section {
padding: 60px 0;
background: #0a0a0a;
}
.storage-grid {
display: grid;
grid-template-columns: 1.5fr 1fr;
gap: 2rem;
align-items: start;
}
.storage-card, .info-card {
background: linear-gradient(145deg, #161616, #1e1e1e);
border: 1px solid #2a2a2a;
border-radius: 16px;
padding: 2rem;
}
.card-header {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1rem;
}
.card-header i {
color: #00d4ff;
font-size: 2rem;
}
.card-header h2 {
color: #fff;
font-size: 1.8rem;
margin: 0;
}
.card-description {
color: #cfcfcf;
margin-bottom: 2rem;
line-height: 1.6;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-group label {
display: block;
color: #00d4ff;
font-weight: 600;
margin-bottom: 0.5rem;
}
.form-group textarea {
width: 100%;
background: #121212;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 1rem;
color: #fff;
font-family: 'Courier New', monospace;
font-size: 0.95rem;
resize: vertical;
transition: border-color 0.3s;
}
.form-group textarea:focus {
outline: none;
border-color: #00d4ff;
}
.char-counter {
display: flex;
justify-content: space-between;
margin-top: 0.5rem;
font-size: 0.9rem;
}
#charCount {
color: #00d4ff;
font-weight: 700;
}
#charStatus {
color: #999;
}
#charStatus.warning {
color: #ffaa00;
}
#charStatus.error {
color: #ff5555;
}
.success-box {
margin-top: 2rem;
padding: 2rem;
background: rgba(0, 255, 166, 0.05);
border: 1px solid rgba(0, 255, 166, 0.2);
border-radius: 12px;
}
.success-header {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1rem;
}
.success-header i {
color: #00ffa6;
font-size: 2rem;
}
.success-header h3 {
color: #00ffa6;
margin: 0;
}
.success-description {
color: #cfcfcf;
margin-bottom: 1.5rem;
}
.link-display {
margin-bottom: 1.5rem;
}
.link-display label {
display: block;
color: #00d4ff;
font-weight: 600;
margin-bottom: 0.5rem;
}
.link-box {
display: flex;
gap: 0.5rem;
}
.link-box input {
flex: 1;
background: #121212;
border: 1px solid #2a2a2a;
border-radius: 8px;
padding: 0.75rem;
color: #00d4ff;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
}
.btn-copy {
padding: 0.75rem 1rem;
white-space: nowrap;
}
.link-display small {
display: block;
color: #999;
margin-top: 0.5rem;
}
.expiry-info {
display: flex;
align-items: center;
gap: 0.5rem;
color: #cfcfcf;
margin-bottom: 1.5rem;
}
.expiry-info i {
color: #ffaa00;
}
.info-sidebar {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.info-icon {
width: 50px;
height: 50px;
background: rgba(0, 212, 255, 0.1);
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 1rem;
}
.info-icon i {
color: #00d4ff;
font-size: 1.5rem;
}
.info-card h3 {
color: #fff;
margin-bottom: 1rem;
}
.info-steps {
padding-left: 1.5rem;
color: #cfcfcf;
line-height: 1.8;
}
.info-list {
list-style: none;
padding: 0;
}
.info-list li {
color: #cfcfcf;
margin-bottom: 0.75rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.info-list i {
color: #00ffa6;
font-size: 0.9rem;
}
.code-description {
color: #cfcfcf;
margin-bottom: 1rem;
}
.code-block {
background: #0a0a0a;
border: 1px solid #1f1f1f;
border-radius: 8px;
padding: 1rem;
color: #00d4ff;
font-family: 'Courier New', monospace;
font-size: 0.85rem;
overflow-x: auto;
line-height: 1.6;
}
.recent-commands-section {
background: #181818;
border:1px solid #232323;
border-radius: 14px;
padding: 1.5rem;
margin-top: 2.5rem;
}
.recent-commands-list {
display: flex;
flex-direction: column;
gap: 1.2rem;
}
.recent-command-card {
background: #222;
border-radius: 10px;
padding: 1rem 1.2rem;
}
.recent-command-row {
display: flex;
gap: .7rem;
align-items: center;
margin-bottom: .3rem;
}
.recent-command-label {
color: #00d4ff;
font-size: .95rem;
min-width: 80px;
}
.recent-command-value {
color: #fff;
font-size: .97rem;
}
.recent-command-link {
color: #00ffa6;
font-size: .97rem;
word-break: break-all;
}
.recent-command-timer {
color: #ffaa00;
font-size: .97rem;
}
.recent-command-text {
font-family: 'Courier New', monospace;
}
@media (max-width: 992px) {
.storage-grid {
grid-template-columns: 1fr;
}
}
</style>
<script>
const textarea = document.getElementById('command');
const charCount = document.getElementById('charCount');
const charStatus = document.getElementById('charStatus');
const commandForm = document.getElementById('commandForm');
const submitBtn = document.getElementById('submitBtn');
const successMessage = document.getElementById('successMessage');
// Character counter
textarea.addEventListener('input', function() {
const length = this.value.length;
charCount.textContent = length;
if (length === 0) {
charStatus.textContent = '';
charStatus.className = '';
} else if (length <= 256) {
charStatus.textContent = '(within chat limit)';
charStatus.className = '';
} else if (length <= 10000) {
charStatus.textContent = '(exceeds chat limit - storage required)';
charStatus.className = 'warning';
} else {
charStatus.textContent = '(exceeds maximum length)';
charStatus.className = 'error';
}
});
// Form submission
commandForm.addEventListener('submit', async function(e) {
e.preventDefault();
const command = textarea.value.trim();
if (!command) return;
if (command.length > 10000) {
alert('Command exceeds maximum length of 10,000 characters');
return;
}
submitBtn.disabled = true;
submitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Storing...';
try {
const response = await fetch('/projects/itemeditor/storage', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ command: command })
});
const data = await response.json();
if (data.success) {
// Hide form, show success
commandForm.style.display = 'none';
successMessage.style.display = 'block';
// Set generated link
document.getElementById('generatedLink').value = data.url;
// Start countdown
startCountdown(data.expires_at);
} else {
alert('Error: ' + (data.error || 'Failed to store command'));
submitBtn.disabled = false;
submitBtn.innerHTML = '<i class="fas fa-save"></i> Store Command';
}
} catch (error) {
console.error('Error:', error);
alert('Failed to store command. Please try again.');
submitBtn.disabled = false;
submitBtn.innerHTML = '<i class="fas fa-save"></i> Store Command';
}
});
function copyLink() {
const linkInput = document.getElementById('generatedLink');
linkInput.select();
document.execCommand('copy');
const copyBtn = event.target.closest('.btn-copy');
const originalHTML = copyBtn.innerHTML;
copyBtn.innerHTML = '<i class="fas fa-check"></i> Copied!';
setTimeout(() => {
copyBtn.innerHTML = originalHTML;
}, 2000);
}
function resetForm() {
commandForm.style.display = 'block';
successMessage.style.display = 'none';
textarea.value = '';
charCount.textContent = '0';
charStatus.textContent = '';
submitBtn.disabled = false;
submitBtn.innerHTML = '<i class="fas fa-save"></i> Store Command';
document.getElementById('generatedLink').value = '';
document.getElementById('expiryTime').textContent = '30 minutes';
}
function startCountdown(expiresAt) {
const expiryTime = document.getElementById('expiryTime');
const endTime = new Date(expiresAt).getTime();
// Update countdown immediately
function updateCountdown() {
const now = new Date().getTime();
const distance = endTime - now;
if (distance < 0) {
expiryTime.innerHTML = '<span style="color: #ff5555;">Expired</span>';
return false;
}
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((distance % (1000 * 60)) / 1000);
expiryTime.textContent = `${minutes}m ${seconds}s`;
return true;
}
// Update immediately
if (!updateCountdown()) return;
// Then update every second
const interval = setInterval(() => {
if (!updateCountdown()) {
clearInterval(interval);
}
}, 1000);
}
// --- Recent Commands Storage (localStorage) ---
function getRecentCommands() {
let cmds = [];
try {
cmds = JSON.parse(localStorage.getItem('recentCommands') || '[]');
} catch {}
return Array.isArray(cmds) ? cmds : [];
}
function setRecentCommands(cmds) {
localStorage.setItem('recentCommands', JSON.stringify(cmds));
}
function addRecentCommand(cmd) {
let cmds = getRecentCommands();
cmds.unshift(cmd);
cmds = cmds.filter(c => c && c.expires_at && new Date(c.expires_at).getTime() > Date.now());
if (cmds.length > 5) cmds = cmds.slice(0,5);
setRecentCommands(cmds);
}
function renderRecentCommands() {
const list = document.getElementById('recentCommandsList');
const cmds = getRecentCommands();
if (!cmds.length) {
list.innerHTML = '<div style="color:#888;">No recent commands.</div>';
return;
}
list.innerHTML = '';
cmds.forEach((cmd, idx) => {
const div = document.createElement('div');
div.className = 'recent-command-card';
div.innerHTML = `
<div class="recent-command-row">
<span class="recent-command-label">Command:</span>
<span class="recent-command-value recent-command-text">${cmd.command.length > 60 ? cmd.command.slice(0,60)+'...' : cmd.command}</span>
</div>
<div class="recent-command-row">
<span class="recent-command-label">Link:</span>
<a href="${cmd.url}" target="_blank" class="recent-command-link">${cmd.url}</a>
</div>
<div class="recent-command-row">
<span class="recent-command-label">Expires in:</span>
<span class="recent-command-timer" id="recent-timer-${idx}"></span>
</div>
`;
list.appendChild(div);
startRecentCountdown(cmd.expires_at, `recent-timer-${idx}`, cmd.url);
});
}
function startRecentCountdown(expiresAt, elemId, url) {
const el = document.getElementById(elemId);
function update() {
const now = Date.now();
const end = new Date(expiresAt).getTime();
const dist = end - now;
if (dist < 0) {
el.innerHTML = '<span style="color:#ff5555;">Expired</span>';
// Remove from localStorage
let cmds = getRecentCommands().filter(c => c.url !== url);
setRecentCommands(cmds);
renderRecentCommands();
return false;
}
const m = Math.floor((dist % (1000*60*60))/(1000*60));
const s = Math.floor((dist % (1000*60))/1000);
el.textContent = `${m}m ${s}s`;
return true;
}
if (!update()) return;
const interval = setInterval(() => {
if (!update()) clearInterval(interval);
}, 1000);
}
// On page load
renderRecentCommands();
// On successful store, add to recent
const origSuccessHandler = function(data) {
addRecentCommand({
command: textarea.value.trim(),
url: data.url,
expires_at: data.expires_at
});
renderRecentCommands();
};
// Patch the form submit handler to call origSuccessHandler
const origSubmit = commandForm.onsubmit;
commandForm.onsubmit = function(e) {
if (origSubmit) origSubmit.call(this, e);
};
// Patch the fetch success in the submit handler
const origFetch = window.fetch;
window.fetch = async function() {
const res = await origFetch.apply(this, arguments);
if (arguments[0] && arguments[0].toString().includes('/projects/itemeditor/storage')) {
try {
const clone = res.clone();
const data = await clone.json();
if (data.success && textarea && textarea.value) {
origSuccessHandler(data);
}
} catch {}
}
return res;
};
</script>
{% endblock %}

File diff suppressed because it is too large Load Diff

View File

@@ -19,16 +19,28 @@
<div class="project-hero-stats">
{% if project.version %}
<div class="hero-stat">
<span class="stat-label">Version</span>
<span class="stat-label">Stable Version</span>
<span class="stat-value">{{ project.version }}</span>
</div>
{% endif %}
{% if project.beta_version %}
<div class="hero-stat">
<span class="stat-label">Beta Version</span>
<span class="stat-value">{{ project.beta_version }}</span>
</div>
{% endif %}
{% if project.status %}
<div class="hero-stat">
<span class="stat-label">Status</span>
<span class="stat-value">{{ project.status }}</span>
</div>
{% endif %}
{% if project.downloads %}
<div class="hero-stat">
<span class="stat-label">Downloads</span>
<span class="stat-value">{{ project.downloads }}</span>
</div>
{% endif %}
{% if project.compatibility %}
<div class="hero-stat">
<span class="stat-label">Compatibility</span>
@@ -38,15 +50,27 @@
</div>
<div class="project-hero-actions">
{% if project.download.stable %}
<a href="{{ project.download.stable }}" target="_blank" class="btn btn-primary">
<i class="fas fa-download"></i> Download Stable
</a>
{% endif %}
{% if project.download.beta %}
<a href="{{ project.download.beta }}" target="_blank" class="btn btn-secondary">
<i class="fas fa-flask"></i> Download Beta
</a>
{% endif %}
{% for link_name, link_url in project.links.items() %}
{% if link_name in ['modrinth', 'spigot', 'github'] %}
<a href="{{ link_url }}" target="_blank" class="btn btn-primary">
{% if link_name in ['modrinth', 'spigot', 'github', 'hangar'] %}
<a href="{{ link_url }}" target="_blank" class="btn btn-outline">
{% if link_name == 'github' %}
<i class="fab fa-github"></i> GitHub
{% elif link_name == 'modrinth' %}
<i class="fas fa-cube"></i> Modrinth
{% elif link_name == 'spigot' %}
<i class="fas fa-plug"></i> SpigotMC
{% elif link_name == 'hangar' %}
<i class="fas fa-book-open"></i> Hangar
{% endif %}
</a>
{% endif %}
@@ -134,6 +158,10 @@
<i class="fas fa-cube"></i>
{% elif link_name == 'spigot' %}
<i class="fas fa-plug"></i>
{% elif link_name == 'hangar' %}
<i class="fas fa-book-open"></i>
{% elif link_name == 'discord' %}
<i class="fab fa-discord"></i>
{% elif link_name == 'wiki' %}
<i class="fas fa-book"></i>
{% elif link_name == 'issues' %}
@@ -248,6 +276,10 @@
<i class="fas fa-cube"></i>
{% elif link_name == 'spigot' %}
<i class="fas fa-plug"></i>
{% elif link_name == 'hangar' %}
<i class="fas fa-book-open"></i>
{% elif link_name == 'discord' %}
<i class="fab fa-discord"></i>
{% else %}
<i class="fas fa-external-link-alt"></i>
{% endif %}
@@ -266,6 +298,10 @@
Download from Modrinth platform
{% elif link_name == 'spigot' %}
Download from SpigotMC resources
{% elif link_name == 'hangar' %}
Download from PaperMC Hangar platform
{% elif link_name == 'discord' %}
Join the community or access the bot where it is available
{% else %}
Additional project resources
{% endif %}

View File

@@ -55,16 +55,16 @@
<span class="stat-value">{{ project.version }}</span>
</div>
{% endif %}
{% if project.downloads %}
{% if project.status %}
<div class="stat">
<span class="stat-label">Status</span>
<span class="stat-value">{{ project.downloads }}</span>
<span class="stat-value">{{ project.status }}</span>
</div>
{% endif %}
{% if project.users %}
{% if project.downloads %}
<div class="stat">
<span class="stat-label">Users</span>
<span class="stat-value">{{ project.users }}</span>
<span class="stat-label">Downloads</span>
<span class="stat-value">{{ project.downloads }}</span>
</div>
{% endif %}
</div>
@@ -82,6 +82,10 @@
<i class="fas fa-cube"></i>
{% elif link_name == 'spigot' %}
<i class="fas fa-plug"></i>
{% elif link_name == 'hangar' %}
<i class="fas fa-book-open"></i>
{% elif link_name == 'discord' %}
<i class="fab fa-discord"></i>
{% else %}
<i class="fas fa-external-link-alt"></i>
{% endif %}
@@ -182,11 +186,13 @@ document.addEventListener('DOMContentLoaded', function() {
card.style.display = 'block';
} else {
const category = card.getAttribute('data-category');
if (category.includes(filter)) {
card.style.display = 'block';
} else {
card.style.display = 'none';
}
// Match 'minecraft' to both 'minecraft-plugin' and 'velocity-plugin'
// Match 'discord' to 'discord-bot'
const matches = (filter === 'minecraft' && (category.includes('minecraft') || category.includes('velocity'))) ||
(filter === 'discord' && category.includes('discord')) ||
(filter !== 'minecraft' && filter !== 'discord' && category.includes(filter));
card.style.display = matches ? 'block' : 'none';
}
});
});

474
versions/version.json Normal file
View File

@@ -0,0 +1,474 @@
{
"friends": {
"stable": "1.3.4",
"beta": "1.4.0-SNAPSHOT-Rev-4",
"dev": "1.4.0-SNAPSHOT-Rev-5",
"project_status": "stable",
"status": {
"stable": "stable",
"beta": "beta",
"dev": "unstable"
},
"version_id": {
"stable": "1.3.4",
"beta": "1.3.9.4"
},
"project_type": "velocity",
"name": "Velocity Friends",
"tagline": "Cross-server friends system for Velocity networks",
"description": "Professional friends system for Velocity proxy servers.",
"long_description": "A comprehensive friends system for Velocity proxy servers. Manage friendships, send messages, and interact across multiple backend servers. Includes status system, offline support, clickable names, and a robust version checker.",
"icon": "fas fa-user-friends",
"download": {
"stable": "https://modrinth.com/plugin/velocity-friends/version/1.3.4",
"beta": "https://modrinth.com/plugin/velocity-friends/version/1.4.0-SNAPSHOT-Rev-4"
},
"links": {
"modrinth": "https://modrinth.com/plugin/velocity-friends",
"hangar": "https://hangar.papermc.io/SimolZimol/Velocity-Friends",
"Ko-fi": "https://ko-fi.com/simolzimol",
"discord": "https://discord.com/invite/vVrpvBEfeQ"
},
"velocity_compat": {
"stable": "3.3.0, 3.4.0-SNAPSHOT",
"beta": "3.3.0, 3.4.0-SNAPSHOT"
},
"mc_compat": {
"stable": "3.3.0, 3.4.0-SNAPSHOT"
},
"server_types": ["Velocity"],
"features": [
"Live server display for friends list",
"Clickable friend names and servers",
"Activity status system (Active, AFK, DND)",
"Offline friend request acceptance",
"Configurable messages and status dots",
"Tab-completion for commands",
"Broadcast and private messaging",
"Plugin Messaging API for integrations",
"Dual storage: JSON & MySQL",
"Interactive settings menu"
],
"technologies": ["Java", "Velocity API", "Adventure API", "Gson", "MySQL", "HikariCP"],
"commands": [{
"command": "/friend add <player>",
"description": "Send a friend request to a player.",
"permission": "friends.use"
}, {
"command": "/friend accept <player>",
"description": "Accept a pending friend request.",
"permission": "friends.use"
}, {
"command": "/friend deny <player>",
"description": "Deny a friend request.",
"permission": "friends.use"
}, {
"command": "/friend remove <player>",
"description": "Remove a friend from your list.",
"permission": "friends.use"
}, {
"command": "/friend list",
"description": "Show all your friends with online status and server location.",
"permission": "friends.use"
}, {
"command": "/friend requests",
"description": "Show all pending friend requests.",
"permission": "friends.use"
}, {
"command": "/friend msg <player> <message>",
"description": "Send a private message to a friend.",
"permission": "friends.use"
}, {
"command": "/friend reply <message>",
"description": "Reply to the last received message.",
"permission": "friends.use"
}, {
"command": "/friend broadcast <message>",
"description": "Send a message to all online friends.",
"permission": "friends.use"
}, {
"command": "/friend settings",
"description": "Open the interactive settings menu.",
"permission": "friends.use"
}, {
"command": "/friend reload",
"description": "Reload the plugin configuration (admin only).",
"permission": "friends.reload"
}
],
"installation": [
"Download the plugin jar from Modrinth or Spigot.",
"Place the jar in your Velocity plugins folder.",
"Restart the proxy server.",
"Configure settings in config.yml as needed."
],
"technical_highlights": [
"Single-source-of-truth versioning via Maven filtering/codegen",
"Robust JSON parsing with Gson",
"Clickable Adventure API chat components",
"Dual storage system with automatic fallback",
"Full Plugin Messaging API for integrations"
],
"stats": {
"downloads": 0,
"likes": 1,
"followers": 1
}
},
"joinme": {
"stable": "1.0.0",
"beta": null,
"dev": null,
"project_status": "in development",
"status": {
"stable": "stable",
"beta": "beta",
"dev": "unstable"
},
"version_id": {
"stable": "1.0.0",
"beta": null
},
"project_type": "velocity",
"name": "JoinMe",
"tagline": "Share your server location with friends",
"description": "Command-based server location sharing for Velocity networks.",
"long_description": "A simple yet powerful plugin for Velocity proxy servers that allows players to share their current server location with friends across the network. Features 8x8 pixel player head rendering, customizable server lists, and automatic version checking.",
"icon": "fas fa-share-alt",
"download": {
"stable": null,
"beta": null
},
"links": {
"Ko-fi": "https://ko-fi.com/simolzimol",
"discord": "https://discord.com/invite/vVrpvBEfeQ"
},
"velocity_compat": {
"stable": "3.3.0, 3.4.0-SNAPSHOT",
"beta": "3.3.0, 3.4.0-SNAPSHOT"
},
"mc_compat": {
"stable": "3.3.0, 3.4.0-SNAPSHOT"
},
"server_types": ["Velocity"],
"features": [
"Command-based server location sharing",
"8x8 pixel player head rendering in chat",
"Dual server list configuration (command-enabled and notification-enabled)",
"Cooldown system to prevent spam",
"Clickable server names in notifications",
"Automatic version checking via remote API",
"YAML configuration with MiniMessage support",
"Configurable permissions system",
"Hot-reload configuration support"
],
"technologies": ["Java", "Velocity API", "Adventure API", "Gson", "SnakeYAML"],
"commands": [{
"command": "/joinme",
"description": "Share your current server location with players on configured servers.",
"permission": "joinme.use"
}, {
"command": "/joinmereload",
"description": "Reload the plugin configuration.",
"permission": "joinme.reload"
}, {
"command": "/joinmeversion",
"description": "Check the plugin version and available updates.",
"permission": "joinme.use"
}
],
"installation": [
"Download the plugin jar from GitHub releases.",
"Place the jar in your Velocity plugins folder.",
"Restart the proxy server.",
"Configure server lists in config.yml.",
"Customize messages and settings as needed."
],
"technical_highlights": [
"8x8 pixel player head rendering using Mojang Session Server API",
"Maven resource filtering for version management",
"Dual server list system for granular control",
"MiniMessage integration for rich text formatting",
"Remote version checking with caching"
],
"stats": {
"downloads": 0,
"likes": 0,
"followers": 0
}
},
"simpleteleport": {
"stable": "1.2.1",
"beta": "1.2.2-SNAPSHOT-Rev-1",
"dev": null,
"project_status": "stable",
"status": {
"stable": "stable",
"beta": "beta",
"dev": "unstable"
},
"version_id": {
"stable": "1.2.1",
"beta": "1.2.2"
},
"project_type": "spigot",
"name": "SimpleTeleport",
"tagline": "Lightweight and powerful teleportation plugin for Spigot servers",
"description": "Comprehensive teleportation system for Spigot with homes, warps, spawn, and back commands.",
"long_description": "SimpleTeleport is a comprehensive and lightweight teleportation plugin for Spigot servers. Set homes, create warps, manage spawn points, and teleport back to previous locations. Features include multi-home support, clickable/hoverable lists, permission system, YAML-based data storage, and automatic version checking with update notifications.",
"icon": "fas fa-location-arrow",
"download": {
"stable": "https://modrinth.com/plugin/simpleteleports/version/1.2.1",
"beta": "https://modrinth.com/plugin/simpleteleports/version/1.2.2"
},
"links": {
"modrinth": "https://modrinth.com/plugin/simpleteleports",
"hangar": "https://hangar.papermc.io/SimolZimol/SimpleTeleport",
"spigot": "https://www.spigotmc.org/resources/simpleteleport.130115",
"Ko-fi": "https://ko-fi.com/simolzimol",
"discord": "https://discord.com/invite/vVrpvBEfeQ"
},
"mc_compat": {
"stable": "1.19, 1.20, 1.21",
"beta": "1.19, 1.20, 1.21"
},
"server_types": ["Spigot", "Paper"],
"features": [
"Multi-home support with named homes",
"Clickable and hoverable home/warp lists",
"Configurable home limits and worlds",
"Comprehensive permission system",
"Spawn management and teleportation",
"Back command for last location",
"Automatic config/messages updater",
"YAML-based data storage",
"Color code and placeholder support",
"Automatic version checking and update notifications"
],
"technologies": ["Java", "Spigot API", "Gson", "YAML"],
"commands": [{
"command": "/sethome [name]",
"description": "Set your personal home location (optionally with a name)",
"permission": "SimpleTeleport.sethome"
}, {
"command": "/home [name]",
"description": "Teleport to your home (optionally specify a home name)",
"permission": "SimpleTeleport.home"
}, {
"command": "/homes",
"description": "List all your homes (clickable/hoverable list)",
"permission": "SimpleTeleport.home"
}, {
"command": "/homeother <player> [home]",
"description": "Teleport to another player's named home",
"permission": "SimpleTeleport.home.others"
}, {
"command": "/delhome [name]",
"description": "Delete one of your homes",
"permission": "SimpleTeleport.delhome"
}, {
"command": "/delhomeother <player> [home]",
"description": "Delete another player's named home",
"permission": "SimpleTeleport.delhome.others"
}, {
"command": "/warp <name>",
"description": "Teleport to a warp point",
"permission": "SimpleTeleport.warp"
}, {
"command": "/setwarp <name>",
"description": "Create a new warp point",
"permission": "SimpleTeleport.setwarp"
}, {
"command": "/delwarp <name>",
"description": "Delete a warp point",
"permission": "SimpleTeleport.delwarp"
}, {
"command": "/warps",
"description": "List all available warps",
"permission": "SimpleTeleport.warps"
}, {
"command": "/spawn",
"description": "Teleport to the server spawn",
"permission": "SimpleTeleport.spawn"
}, {
"command": "/spawn set",
"description": "Set the server spawn location",
"permission": "SimpleTeleport.setspawn"
}, {
"command": "/back",
"description": "Teleport to your last location",
"permission": "SimpleTeleport.back"
}, {
"command": "/stpversion",
"description": "Display plugin version information and check for updates",
"permission": "SimpleTeleport.version"
}
],
"installation": [
"Download the plugin jar from Modrinth.",
"Place the jar in your Spigot/Paper plugins folder.",
"Restart the server.",
"Configure settings in config.yml and messages.yml as needed."
],
"technical_highlights": [
"Single-source-of-truth versioning via Maven filtering/codegen",
"Robust JSON parsing with Gson",
"Clickable and hoverable Adventure API chat components",
"Automatic config/messages updater",
"Full permission and configuration system"
],
"stats": {
"downloads": "over 500",
"likes": 0,
"followers": 0
}
},
"itemeditor": {
"stable": "1.2.0",
"beta": "1.2.2",
"dev": "1.2.3",
"project_status": "stable",
"status": {
"stable": "stable",
"beta": "beta",
"dev": "unstable"
},
"version_id": {
"stable": "1.2.0",
"beta": "1.2.2"
},
"project_type": "spigot",
"name": "Item Editor",
"tagline": "Powerful in-game item editor for Spigot servers",
"description": "Edit Minecraft items in-game with a modern GUI, including lore, color, enchantments, PvP/No PvP, and custom actions.",
"long_description": "Item Editor is a comprehensive and user-friendly plugin for Spigot servers, allowing players and admins to edit items directly in-game. Features include a modern GUI for editing item name, lore, color, and enchantments, as well as per-item PvP/No PvP toggles and custom left-click actions. Messages and feedback are fully customizable, and all features are accessible via an intuitive menu.",
"icon": "fas fa-edit",
"download": {
"stable": "https://modrinth.com/plugin/itemeditor/version/1.2.0",
"beta": "https://modrinth.com/plugin/itemeditor/version/1.2.2"
},
"links": {
"Command Storage": "https://devanturas.net/projects/itemeditor/storage",
"modrinth": "https://modrinth.com/plugin/itemeditor",
"hangar": "https://hangar.papermc.io/SimolZimol/Itemeditor",
"spigot": "https://www.spigotmc.org/resources/itemeditor.130589/",
"Ko-fi": "https://ko-fi.com/simolzimol",
"discord": "https://discord.com/invite/vVrpvBEfeQ"
},
"mc_compat": {
"stable": "1.19, 1.20, 1.21"
},
"server_types": ["Spigot", "Paper"],
"features": [
"Modern GUI for item editing",
"Edit name, lore, color, and enchantments",
"Per-item PvP and No PvP toggles",
"Custom left-click actions (3 modes)",
"Customizable and disable-able messages",
"Persistent item data storage",
"Color code and placeholder support"
],
"technologies": ["Java", "Spigot API", "Adventure API", "Gson"],
"commands": [{
"command": "/itemeditor",
"description": "Open the item editor GUI for the held item.",
"permission": "itemeditor.use"
}, {
"command": "/itemeditor reload",
"description": "Reload the plugin configuration.",
"permission": "itemeditor.reload"
}
],
"installation": [
"Download the plugin jar from the release page.",
"Place the jar in your Spigot/Paper plugins folder.",
"Restart the server.",
"Configure settings in config.yml and messages.yml as needed."
],
"technical_highlights": [
"Modern, intuitive GUI for all item features",
"Per-item persistent data using PersistentDataContainer",
"Color code-insensitive message disabling",
"Full permission and configuration system"
],
"stats": {
"downloads": "over 250",
"likes": 0,
"followers": 0
}
},
"staffchat": {
"stable": "1.1.0",
"beta": "1.2.0",
"dev": null,
"project_status": "stable",
"status": {
"stable": "stable",
"beta": "beta",
"dev": "unstable"
},
"version_id": {
"stable": "1.1.0",
"beta": "1.2.0"
},
"project_type": "velocity",
"name": "StaffChat",
"tagline": "Secure and configurable staff chat for Velocity networks",
"description": "A professional staff chat system for Velocity proxy servers with Discord integration, logging, and full customization.",
"long_description": "StaffChat is a secure and highly configurable staff chat plugin for Velocity proxy servers. Features include Discord integration (bi-directional), a dedicated Discord log channel for staff events (join, leave, mute, server switch), fully customizable messages with color and hex support, YAML config with auto-update, and permission-based access. Includes a Discord slash command to list all online staff members and their status.",
"icon": "fas fa-user-shield",
"download": {
"stable": "https://modrinth.com/plugin/velocity-staffchat/version/1.1.0",
"beta": "https://modrinth.com/plugin/velocity-staffchat/version/1.2.0"
},
"links": {
"modrinth": "https://modrinth.com/plugin/velocity-staffchat",
"hangar": "https://hangar.papermc.io/SimolZimol/StaffChat",
"Ko-fi": "https://ko-fi.com/simolzimol",
"discord": "https://discord.com/invite/vVrpvBEfeQ"
},
"velocity_compat": {
"stable": "3.3.0, 3.4.0-SNAPSHOT",
"beta": "3.3.0, 3.4.0-SNAPSHOT"
},
"mc_compat": {
"stable": "3.3.0, 3.4.0-SNAPSHOT"
},
"server_types": ["Velocity"],
"features": [
"Bi-directional Discord integration",
"Dedicated Discord log channel for staff events",
"Configurable messages with color and hex support",
"YAML config with auto-update",
"Permission-based access",
"Discord slash command for staff list",
"Toggle command for staff chat",
"Full placeholder support in messages"
],
"technologies": ["Java", "Velocity API", "Adventure API", "JDA", "SnakeYAML"],
"commands": [
{"command": "/sc <message>", "description": "Send a message to staff chat.", "permission": "staffchat.use"},
{"command": "/staffchat <message>", "description": "Alias for /sc.", "permission": "staffchat.use"},
{"command": "/s <message>", "description": "Alias for /sc.", "permission": "staffchat.use"},
{"command": "/a <message>", "description": "Alias for /sc.", "permission": "staffchat.use"},
{"command": "/sctoggle", "description": "Toggle receiving staff chat messages.", "permission": "staffchat.use"},
{"command": "/staff-list (Discord)", "description": "Show all online staff members and their status in Discord.", "permission": "Discord role (configurable)"}
],
"installation": [
"Download the plugin jar.",
"Place the jar in your Velocity plugins folder.",
"Restart the proxy server.",
"Configure settings in config.yml as needed."
],
"technical_highlights": [
"YAML config auto-update system",
"Full Discord integration with JDA",
"Advanced placeholder and color support"
],
"stats": {
"downloads": 0,
"likes": 0,
"followers": 0
}
}
}