Perselisihan bot dengan ekonomi dengan sqlite

Halo, Habr!


Saya ingin berbagi pengalaman, karena saya menulis bot dengan ekonomi untuk server yang tidak teratur menggunakan sqlite dan hal-hal kecil lainnya.

Fase persiapan


Pembuatan bot


Jadi, sebelum menulis bot, kita perlu membuatnya dan mendapatkan token:

  1. Pergi ke situs pengembang
  2. Klik pada tombol "Aplikasi Baru" dan beri nama bot
  3. Dapatkan token bot dengan masuk ke bot Anda dan menemukan tab Bot di daftar Pengaturan

Modul yang Diperlukan


Bagaimanapun, kita menulis dengan python, bukan ASM, jadi kita perlu beberapa modul

$ pip install discord.py # api     

 $ pip install tabulate #     

Tahap penulisan


Modul Impor


Mengimpor modul semudah menulis satu halaman dalam HTML + CSS.

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

Terhubung ke sqlite


Tidak ada yang rumit di sini. Tepat setelah impor, tulis yang berikut ini:

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

Persiapan Basis Data


Akan ada 2 toko dan tabel pengguna dalam database.

 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 ) 

Bersiap untuk menulis logika bot


Buat variabel bot.

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

Di akhir semua kode, kami menulis metode yang meluncurkan bot kami.

 bot.run(" ,       ") 

Sekarang mari kita mulai menulis bot kita.

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

Selanjutnya, kami menulis acara on_ready (), yang bertanggung jawab atas ketersediaan 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()#    

Setelah itu, agar tidak memulai kembali bot sekali lagi, tulis metode 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()#    

Jika bot kami bersifat ekonomi, maka harus ada mata uang, pendapatan, dan pengeluarannya. Penghasilan dapat diatur menggunakan sistem pengalaman.

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

Kami menulis salah satu bagian utama. Tetap menulis perintah seperti akun, toko, dll. Saya berpikir lebih jauh secara intuitif.

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

Jika Anda memiliki toko, maka Anda dapat membeli? Bukan begitu?

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

Kesimpulan


Di sini kita punya bot sederhana. Semoga ini bisa membantu seseorang.

Saya mengerti bahwa adalah mungkin (perlu) untuk menambahkan banyak fungsi dan chip ke dalamnya, tetapi ini adalah versi telanjang dari kode yang dapat digunakan pemula untuk memahami bagaimana discord.py, modul sqlite dan metode built-in python bekerja.

Terima kasih atas perhatiannya. Untuk koneksi!

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


All Articles