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:
- Pergi ke situs pengembang
- Klik pada tombol "Aplikasi Baru" dan beri nama bot
- 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
$ pip install tabulate
Tahap penulisan
Modul Impor
Mengimpor modul semudah menulis satu halaman dalam HTML + CSS.
import sqlite3
Terhubung ke sqlite
Tidak ada yang rumit di sini. Tepat setelah impor, tulis yang berikut ini:
conn = sqlite3.connect("Discord.db")
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="_")
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="_")
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:
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!