Discord bot con economía con sqlite

Hola Habr!


Quería compartir mi experiencia, ya que escribí un bot con economía para un servidor de discordia que usa sqlite y otras pequeñas cosas.

Fase preparatoria


Creación de bot


Entonces, antes de escribir un bot, necesitamos crearlo y obtener un token:

  1. Ir al sitio del desarrollador
  2. Haga clic en el botón "Nueva aplicación" y asigne un nombre al bot
  3. Obtenga el token bot iniciando sesión en su bot y buscando la pestaña Bot en la lista Configuración

Módulos requeridos


Después de todo, estamos escribiendo en Python, no en ASM, por lo que necesitaremos algunos módulos

$ pip install discord.py # api     

 $ pip install tabulate #     

Etapa de escritura


Importar módulos


Importar módulos es tan simple como escribir una sola página en HTML + CSS.

 import sqlite3 # sqlite import discord # discord api from discord.ext import commands #     from tabulate import tabulate #     import json #    ,        

Conectarse a sqlite


No hay nada complicado aquí. Justo después de la importación, escriba lo siguiente:

 conn = sqlite3.connect("Discord.db") #  :memory: cursor = conn.cursor() 

Preparación de bases de datos


Habrá 2 tablas de tienda y usuarios en la base de datos.

 CREATE TABLE "shop" ( "id" INT, "type" TEXT, "name" TEXT, "cost" INT ) 

 CREATE TABLE "users" ( "id" INT, "nickname" TEXT, "mention" TEXT, "money" INT, "rep_rank" TEXT, "inventory" TEXT, "lvl" INT, "xp" INT ) 

Preparándose para escribir lógica de bot


Crea la variable bot.

 bot = commands.Bot(command_prefix="_")#  command_prefix    , , ,   .. 

Al final de todo el código, escribimos un método que lanza nuestro bot.

 bot.run(" ,       ") 

Ahora comencemos a escribir nuestro bot.

 bot = commands.Bot(command_prefix="_") #     bot.run(" ,       ") 

A continuación, escribimos el evento on_ready (), que es responsable de la disponibilidad del bot.

 @bot.event async def on_ready(): print("Bot Has been runned")#   for guild in bot.guilds:#..    ,       print(guild.id)# id  serv=guild#    for member in guild.members:#,    cursor.execute(f"SELECT id FROM users where id={member.id}")#,      if cursor.fetchone()==None:#   cursor.execute(f"INSERT INTO users VALUES ({member.id}, '{member.name}', '<@{member.id}>', 50000, 'S','[]',0,0)")#       else:#  pass conn.commit()#    

Después de eso, para no reiniciar el bot una vez más, escriba el método on_member_join ()

 @bot.event async def on_member_join(member): cursor.execute(f"SELECT id FROM users where id={member.id}")# ,      if cursor.fetchone()==None:#   cursor.execute(f"INSERT INTO users VALUES ({member.id}, '{member.name}', '<@{member.id}>', 50000, 'S','[]',0,0)")#       else:#  pass conn.commit()#    

Si nuestro bot es económico, entonces debe haber una moneda, sus ganancias y sus gastos. Las ganancias se pueden organizar utilizando el sistema de experiencia.

 @bot.event async def on_message(message): if len(message.content) > 10:#    > 10 ... for row in cursor.execute(f"SELECT xp,lvl,money FROM users where id={message.author.id}"): expi=row[0]+random.randint(5, 40)#     cursor.execute(f'UPDATE users SET xp={expi} where id={message.author.id}') lvch=expi/(row[1]*1000) print(int(lvch)) lv=int(lvch) if row[1] < lv:#    ,     ,... await message.channel.send(f' !')#  ... bal=1000*lv cursor.execute(f'UPDATE users SET lvl={lv},money={bal} where id={message.author.id}')#    await bot.process_commands(message)#     ctx  conn.commit()#    

Escribimos una de las partes principales. Queda por escribir comandos como cuenta, tienda, etc. Pienso más intuitivamente.

 @bot.command() async def account(ctx): # _account ( "_",     ) table=[["nickname","money","lvl","xp"]] for row in cursor.execute(f"SELECT nickname,money,lvl,xp FROM users where id={ctx.author.id}"): table.append([row[0],row[1],row[2],row[3]]) await ctx.send(f">\n{tabulate(table)}") @bot.command() async def inventory(ctx):# _inventory ( "_",     ) counter=0 for row in cursor.execute(f"SELECT inventory FROM users where id={ctx.author.id}"): data=json.loads(row[0]) table=[["id","type","name"]] for row in data: prt=row for row in cursor.execute(f"SELECT id,type,name FROM shop where id={prt}"): counter+=1 table.append([row[0],row[1],row[2]]) if counter==len(data): await ctx.send(f'>\n{tabulate(table)}') @bot.command() async def shop(ctx):# _shop ( "_",     ) counter=0 table=[["id","type","name","cost"]] for row in cursor.execute(f"SELECT id,type,name,cost FROM shop"): counter+=1 table.append([row[0],row[1],row[2],row[3]]) if counter==4: await ctx.send(f'>\n{tabulate(table)}') 

Si tienes una tienda, ¿puedes comprar? ¿No es así?

 async def buy(ctx, a: int): uid=ctx.author.id await ctx.send('...    ,   id  [buy {id}]') for row in cursor.execute(f"SELECT money FROM users where id={uid}"): money = row[0] for row in cursor.execute(f"SELECT id,name,cost FROM shop where id={a}"): cost=row[2] if money >= cost:#    ,... money -=cost await ctx.send(f'  "{row[1]}"  {row[2]}') for row in cursor.execute(f"SELECT inventory FROM users where id={uid}"): data=json.loads(row[0]) data.append(a) daed=json.dumps(data) cursor.execute('UPDATE users SET money=?,inventory = ? where id=?',(money,daed,uid))#     pass if money < cost:#    await ctx.send(f' ') pass conn.commit()#    

Conclusión


Aquí tenemos un bot tan simple. Espero que esto ayude a alguien.

Entiendo que puede (necesario) agregarle muchas funciones y chips, pero esta es una versión básica del código que los principiantes pueden usar para comprender cómo funcionan discord.py, el módulo sqlite y los métodos integrados de Python.

Gracias a todos por su atención. A la conexión!

Source: https://habr.com/ru/post/482290/


All Articles