Zwietracht Bot mit Wirtschaft mit SQLite

Hallo habr


Ich wollte meine Erfahrungen teilen, als ich einen wirtschaftswissenschaftlichen Bot für einen Discord-Server mit SQLite und anderen kleinen Dingen schrieb.

Vorbereitungsphase


Bot-Erstellung


Bevor wir einen Bot schreiben, müssen wir ihn erstellen und einen Token erhalten:

  1. Gehen Sie zur Entwicklerseite
  2. Klicken Sie auf die Schaltfläche "Neue Anwendung" und benennen Sie den Bot
  3. Holen Sie sich das Bot-Token, indem Sie sich bei Ihrem Bot anmelden und die Registerkarte Bot in der Liste Einstellungen finden

Erforderliche Module


Schließlich schreiben wir in Python, nicht in ASM, also werden wir einige Module benötigen

$ pip install discord.py # api     

 $ pip install tabulate #     

Schreibbühne


Module importieren


Das Importieren von Modulen ist so einfach wie das Schreiben einer einzelnen Seite in HTML + CSS.

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

Verbinden Sie sich mit sqlite


Hier ist nichts kompliziert. Schreiben Sie kurz nach dem Import Folgendes:

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

Datenbankvorbereitung


Die Datenbank enthält 2 Shop- und Benutzertabellen.

 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 ) 

Vorbereiten der Bot-Logik


Erstellen Sie die Bot-Variable.

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

Am Ende des Codes schreiben wir eine Methode, die unseren Bot startet.

 bot.run(" ,       ") 

Jetzt fangen wir an, unseren Bot zu schreiben.

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

Als nächstes schreiben wir das Ereignis on_ready (), das für die Verfügbarkeit des Bots verantwortlich ist.

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

Danach schreiben Sie die Methode on_member_join (), um den Bot nicht noch einmal neu zu starten

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

Wenn unser Bot wirtschaftlich ist, muss es eine Währung geben, ihre Einnahmen und Ausgaben. Einnahmen können mit dem Erlebnissystem vereinbart werden.

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

Wir haben einen der Hauptteile geschrieben. Es bleiben Befehle wie account, store usw. zu schreiben. Ich denke weiter intuitiv.

 @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)}') 

Wenn Sie ein Geschäft haben, können Sie dann kaufen? Oder?

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

Fazit


Hier haben wir so einen einfachen Bot. Hoffe das hilft jemandem.

Ich verstehe, dass es möglich (notwendig) ist, viele Funktionen und Chips hinzuzufügen, aber dies ist eine reine Version des Codes, mit dem Anfänger verstehen können, wie die integrierten Methoden discord.py, sqlite module und python funktionieren.

Vielen Dank für Ihre Aufmerksamkeit. Zur verbindung!

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


All Articles