YnM Xp Plugin py

"""
Szerzői jog: 2024, YnM
Szerkesztette: Markus ([email protected])
Minden jog fenntartva.
"""

from sopel import plugin
import sqlite3
import os

DB_FILE = os.path.expanduser("/home/ai/.sopel/xp.db")

# Frissített rangok
RANKS = [
    (0, "Újonc"),
    (100, "Haladó"),
    (500, "Veterán"),
    (1000, "Mester"),
    (10000, "Legenda"),
    (100000, "10-zesek")
]

def init_db():
    with sqlite3.connect(DB_FILE) as conn:
        cur = conn.cursor()
        cur.execute("""
        CREATE TABLE IF NOT EXISTS xp (
            user TEXT PRIMARY KEY,
            xp INTEGER DEFAULT 0
        )
        """)
        conn.commit()

init_db()

def add_xp(nick, amount=5):
    with sqlite3.connect(DB_FILE) as conn:
        cur = conn.cursor()
        cur.execute("INSERT INTO xp (user, xp) VALUES (?, ?) ON CONFLICT(user) DO UPDATE SET xp = xp + ?;",
                    (nick, amount, amount))
        conn.commit()

def get_xp(nick):
    with sqlite3.connect(DB_FILE) as conn:
        cur = conn.cursor()
        cur.execute("SELECT xp FROM xp WHERE user = ?", (nick,))
        row = cur.fetchone()
    return row[0] if row else 0

def get_rank(xp):
    for threshold, rank in reversed(RANKS):
        if xp >= threshold:
            return rank
    return "Ismeretlen"

@plugin.rule(r'\[(\S+)\](.*)')  # A [Felhasználó] és az üzenet (bármilyen karakter) figyelése
def gain_xp(bot, trigger):
    user = trigger.group(1)  # Kinyeri a felhasználó nevét a [ ] között
    message = trigger.group(2).strip()  # Üzenet kinyerése, eltávolítva a felesleges szóközöket

    if user and message:
        words = message.split()  # Az üzenet szavakra bontása
        message_length = len(message)  # Üzenet teljes hossza

        # Ha csak egy szó van, akkor 1 XP
        if len(words) == 1:
            xp_to_add = 1
        elif message_length <= 10:
            xp_to_add = 5
        elif message_length <= 20:
            xp_to_add = 10
        else:
            xp_to_add = 10  # Ha 20 karakter vagy több, akkor is 10 XP-t adunk

        add_xp(user, xp_to_add)  # XP hozzáadása a felhasználóhoz




@plugin.rule(r'\[(\S+)\]!xp')  # Itt már csak a [Felhasználó]!xp mintát figyeljük
@plugin.command('xp')
def check_xp(bot, trigger):
    user = trigger.group(1)  # Kinyeri a felhasználó nevét a [ ] között
    xp = get_xp(user)
    rank = get_rank(xp)
    bot.say(f"{user}, jelenlegi XP-d: {xp}, rangod: {rank}.")

@plugin.rule(r'\[(\S+)\]!xptop')  # Itt is csak a [Felhasználó]!xptop mintát figyeljük
@plugin.command('top')
def top_xp(bot, trigger):
    with sqlite3.connect(DB_FILE) as conn:
        cur = conn.cursor()
        # Módosított SQL lekérdezés a top 10 felhasználóhoz
        cur.execute("SELECT user, xp FROM xp ORDER BY xp DESC LIMIT 10")
        rows = cur.fetchall()

    if rows:
        response = "Top 10 felhasználó: " + ", ".join([f"{row[0]} ({row[1]} XP)" for row in rows])
        bot.say(response)
    else:
        bot.say("Még nincs XP adat.")

PHP

<?php
/*
Szerzői jog: 2024, YnM
Szerkesztette: Markus ([email protected])
Minden jog fenntartva.
*/

// Csatlakozás az adatbázishoz
$database = new SQLite3('/home/ai/.sopel/xp.db');

// Rangok meghatározása
$ranks = [
    [0, "Újonc"],
    [100, "Haladó"],
    [500, "Veterán"],
    [1000, "Mester"],
    [10000, "Legenda"],
    [100000, "10-zesek"]
];

// SQL lekérdezés a legjobb 10 felhasználóhoz
$result = $database->query("SELECT user, xp FROM xp ORDER BY xp DESC LIMIT 10");

// Függvény a rang meghatározására
function get_rank($xp, $ranks) {
    foreach (array_reverse($ranks) as $rank) {
        if ($xp >= $rank[0]) {
            return $rank[1];
        }
    }
    return "Ismeretlen"; // Alapértelmezett rang
}
?>

<link href="/css/ynm.statisztika.css" rel="stylesheet">
<div class="container mt-5">
    <h2 class="text-center">XP Ranglista</h2>
    <table class="table table-striped">
        <thead>
            <tr>
                <th>#</th>
                <th>Felhasználó</th>
                <th>XP</th>
                <th>Rang</th>
            </tr>
        </thead>
        <tbody>
            <?php $rank = 1; while ($row = $result->fetchArray(SQLITE3_ASSOC)): ?>
            <tr>
                <td><?php echo $rank++; ?></td>
                <td><?php echo htmlspecialchars($row['user']); ?></td>
                <td><?php echo $row['xp']; ?></td>
                <td><?php echo get_rank($row['xp'], $ranks); ?></td>
            </tr>
            <?php endwhile; ?>
        </tbody>
    </table>
</div>