Discord bot avec l'économie avec sqlite

Bonjour, Habr!


Je voulais partager mon expérience, car j'ai écrit un bot avec des données économiques pour un serveur de discordance utilisant sqlite et d'autres petites choses.

Phase préparatoire


Création de bots


Donc, avant d'écrire un bot, nous devons le créer et obtenir un jeton:

  1. Accédez au site du développeur
  2. Cliquez sur le bouton "Nouvelle application" et nommez le bot
  3. Obtenez le jeton de bot en vous connectant à votre bot et en trouvant l'onglet Bot dans la liste des paramètres

Modules requis


Après tout, nous écrivons en python, pas en ASM, nous aurons donc besoin de quelques modules

$ pip install discord.py # api     

 $ pip install tabulate #     

Étape d'écriture


Importer des modules


L'importation de modules est aussi simple que d'écrire une seule page en HTML + CSS.

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

Se connecter à sqlite


Il n'y a rien de compliqué ici. Juste après l'importation, écrivez ce qui suit:

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

Préparation de la base de données


Il y aura 2 tables de magasin et d'utilisateurs dans la base de données.

 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 ) 

Préparation à l'écriture de la logique du bot


Créez la variable bot.

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

À la fin de tout le code, nous écrivons une méthode qui lance notre bot.

 bot.run(" ,       ") 

Commençons maintenant à écrire notre bot.

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

Ensuite, nous écrivons l'événement on_ready (), qui est responsable de la disponibilité du 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()#    

Après cela, afin de ne pas redémarrer le bot, écrivez la méthode 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 notre bot est économique, alors il doit y avoir une devise, ses gains et ses dépenses. Les gains peuvent être organisés à l'aide du système d'expérience.

 @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()#    

Nous avons écrit l'une des parties principales. Il reste à écrire des commandes telles que compte, magasin, etc. Je pense encore plus intuitivement.

 @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 vous avez un magasin, alors vous pouvez acheter? N'est-ce pas?

 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()#    

Conclusion


Ici, nous avons un bot si simple. J'espère que cela aide quelqu'un.

Je comprends qu'il est possible (nécessaire) d'y ajouter de nombreuses fonctions et puces, mais il s'agit d'une version nue du code que les débutants peuvent utiliser pour comprendre comment discord.py, le module sqlite et les méthodes intégrées python fonctionnent.

Merci à tous pour votre attention. À la connexion!

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


All Articles