Saya mencoba membuat bot Discord saya menghapus beberapa pesan dari saluran tertentu, saya mendapatkan kesalahan

AttributeError: 'int' object has no attribute 'purge'

Fungsinya di bawah

await clearChannel(3, 837017813357035560)
@bot.event
async def clearChannel(number, channel):
    await channel.purge(limit=number)
0
Justin Wilker 12 Mei 2021, 22:41

2 jawaban

Jawaban Terbaik

Selamat datang di Discord.py!

Ada beberapa hal yang salah di sini.

  • Anda harus menggunakan dekorator @bot.command() - Anda bingung dengan @bot.event

  • Perintah tidak dirancang untuk dipicu oleh kode lain - itu bukan metode biasa dalam pengertian itu. Pengguna Anda akan memicu perintah dengan !clearChannel di obrolan Discord, di mana ! adalah awalan yang telah Anda tetapkan untuk objek bot.

  • Pengguna Anda tidak perlu memasukkan ID saluran secara manual agar perintah berfungsi. Ini akan menjadi tidak perlu rumit bagi pengguna akhir untuk menangani. Sebagai gantinya, Anda harus mendapatkan ID saluran secara otomatis dari tempat pesan perintah dikirim.

Kode Anda harus sebagai berikut;

@commands.has_permissions(administrator=True)
@bot.command()
async def clear(ctx, number: int):
  await ctx.channel.purge(limit=number)

Beberapa hal yang saya tambahkan;

  • Saya telah menambahkan tanda centang untuk memastikan bahwa hanya administrator yang dapat menggunakan perintah ini. Jika Anda tidak memvalidasi perintah yang dapat merusak server Anda, setelah bot Anda diterapkan, pengguna mana pun akan dapat menghapus sejumlah pesan yang mereka inginkan.

  • number: int adalah petunjuk tipe. Ini akan mencoba mengurai parameter number ke int, yang Anda inginkan saat Anda meneruskannya ke metode purge. Jika tidak dapat diuraikan, misalnya jika berisi karakter non-numerik, Anda dapat mengatasinya. Menggunakan petunjuk jenis juga meningkatkan keterbacaan kode.

EDIT:

Sepertinya saya salah memahami pertanyaan Anda. Saya kira Anda mencari metode non-perintah yang kemudian dapat Anda terapkan dalam acara atau yang serupa.

Untuk melakukan ini, pada dasarnya akan sama.

async def clear_channel(channels, limit: int): # channels should be a list of discord.Channel objects
  for channel in channels:
    await channel.purge(limit=limit)

Anda bisa mendapatkan daftar saluran yang harus Anda lewati dengan meminta ID saluran kepada administrator, dan menggunakan get_channel() untuk mendapatkan objek discord.Channel, lalu menambahkannya ke daftar untuk diteruskan ke metode di atas. Ada juga cara yang lebih mudah digunakan untuk melakukan ini dengan meneruskan nama saluran dan mendapatkan objek saluran seperti itu, tetapi saya akan menyerahkannya kepada Anda;)

1
Malted 12 Mei 2021, 21:02

Saya yakin masalahnya adalah Anda menggunakan kata kunci channel untuk argumen fungsi. Karena channel adalah tipe objek dengan discord.py, penamaan argumen channel akan menyebabkan Python percaya variabel channel (yang Python akan menafsirkan 837017813357035560 sebagai int) dalam lingkup bagian dalam fungsi berbeda dari lingkup luar obj channel.

Sarankan penamaan untuk chan atau sesuatu. Anda kemudian perlu menginisialisasi variabel tipe channel dengan ID nilai chan untuk tujuan identifikasi.

0
tboggs300 12 Mei 2021, 20:09