"""
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>