Çözüldü Discord kullanıcının duruma göre rol nasıl verilir?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

kaan32k

Decapat
Katılım
5 Şubat 2021
Mesajlar
101
Daha fazla  
Cinsiyet
Erkek
Discord'da durumuna X yazana Y rolü vermek istiyorum bunun kodu var mıdır? Node.js için çalışacak?
 
Son düzenleyen: Moderatör:
Çözüm
Kullanıcı adına göre çalışıyordu, ben sadece her mesajı değil kullanıcı hareketlerini izleyecek şekilde düzenledim. Bu sayede birisi rolü aldıktan sonra kullanıcı adını değiştirse bile rolün alınmaması durumu ortadan kalkmış oldu.

Dokümanlarda kullanıcının özel durumu ile ilgili bir şey bulamadım. Sanırım bunun için de erişim izni yok. Bazı yerlerde presence verisinden geliyor diye okudum ancak presence verisinde de bulamadım.


Discord.py'de şöyle bir şey var. https://discordpy.readthedocs.io/en/stable/api.html#discord.Member.activity

CustomActivity olarak dönüyor diye biliyorum ancak discord.js'de nasıldır var mıdır gram bilmiyorum.
Son düzenleme:
Gönder bakayım. Ben de yaptım bir şeyler birleştirir yollarım.

Görünüşe göre botların, kullanıcı durumlarını görüntülemelerine yasak gelmiş.

Kaynak: Let bots and OAuth2 apps read user bios and banners · Issue #3095 · discord/discord-api-docs

Başka bir şekilde rol atamanız gerekecek.
client.on('message', message => {
let tag = "TAG"; // TAGINIZ
let rol = "627387152837115904"; //tag alındığı zaman verilecek rolün ID-si
let channel = message.guild.channels.find('name', 'tagrol-log'); //tagrol-log yerine kendi kanalınızın ismini yaza bilirsiniz
if (!rol) return;
if (!tag) return;
if (message.member.user.username.includes(tag)) {
if (message.member.roles.has(rol)) return;
message.member.addRole(rol).then(() => {
const tagalma = new Discord.RichEmbed()
.setColor("RANDOM")
.setDescription(`${message.author} ${tag} tagını aldığından dolayı <@&TAG ALANLARIN VERİLECEK ROL ID> rolü Verildi`)
.setTimestamp()
channel.send(tagalma)
});
}
if (!message.member.user.username.includes(tag)) {
if (!message.member.roles.has(rol)) return;
message.member.removeRole(rol).then(() => {
const tagsilme = new Discord.RichEmbed()
.setColor("RANDOM")
.setDescription(`${message.author} ${tag} tagını sildiğinden dolayı <@&TAG ALANLARIN ALINACAK ROL ID> rolü Alındı`)
.setTimestamp()
channel.send(tagsilme)
});
}
});

Hocam bunu duruma göre editleyebilir misiniz?
 
@kaan32k Örnek olarak verdiğiniz kodda kullanıcının kullanıcı adına göre işlem yapıyor. Evet, bu şekilde ilerleyebiliriz. Ancak dediğim gibi kullanıcının "hakkımda" yazısına erişimimiz yok.

Gönderdiğiniz kod geliştirilebilir. Her mesajı dinlememiz gerekmiyor, bunun için "kullanıcı adı güncellendi" event'i var.

Aşağıdaki gibi geliştirebilirim.
JavaScript:
client.on('guildMemberUpdate', (oldMember, newMember) => {
   const guild = newMember.guild;
   const tag = "TAG"; // Sunucunun tagı
   const tagRole = "627387152837115904"; // Verilecek rolün ID si
   const channel = guild.channels.cache.find(ch => ch.name === 'tagrol-log'); // Değişimlerin paylaşılacağı günlük kanalı adı

   // Kullanıcı adı değişmişse işleme devam edeceğiz
   if (newMember.nickname && oldMember.nickname !== newMember.nickname) {
      // Eğer kullanıcı adında belirlediğimiz TAG var ise ve rol atanmamış ise işleme devam edeceğiz
      if (newMember.nickname.includes(tag) && !newMember.roles.cache.has(tagRole)) {
         const role = guild.roles.cache.get(tagRole); // Rolü çektik
         newMember.roles.add(role); // Rolü verdik
         // Log tuttuğumuz kanala mesajı ayarlıyoruz
         const tagAdded = new Discord.MessageEmbed()
            .setColor("RANDOM")
            .setDescription(`${newMember.user.tag}, ${tag} tagını belirttiği için ${role.name} rolü verildi.`)
            .setTimestamp();
         channel.send(tagAdded); // Log mesajını gönderdik
      }
      // Yeni kullanıcı adında tag yok ama rolü var ise
      else if (!newMember.nickname.includes(tag) && newMember.roles.cache.has(tagRole))
         const role = guild.roles.cache.get(tagRole);
         newMember.roles.remove(role); // Rolü elinden akdık
         const tagRemoved = new Discord.MessageEmbed()
            .setColor("RANDOM")
            .setDescription(`${newMember.user.tag}, ${tag} tagını sildiği için ${role.name} rolü alındı.`)
            .setTimestamp();
         channel.send(tagRemoved);
      }
   }
});

Bu arada lütfen kod paylaşırken kod bloğu olarak paylaşın. Böylece okuması daha kolay oluyor.
1685805871286.png


Eğer birçok sunucuda kullanılacak ise bu bot TagRole değişkeninin bir isim ile ayarlanması daha uygun olur.
 
@kaan32k örnek olarak verdiğiniz kodda kullanıcının kullanıcı adına göre işlem yapıyor. Evet, bu şekilde ilerleyebiliriz. Ancak dediğim gibi kullanıcının "hakkımda" yazısına erişimimiz yok.

Gönderdiğiniz kod geliştirilebilir. Her mesajı dinlememiz gerekmiyor, bunun için "kullanıcı adı güncellendi" Event'i var.

Aşağıdaki gibi geliştirebilirim.
JavaScript:
client.on('guildMemberUpdate', (oldMember, newMember) => {
 const guild = newMember.guild;
 const tag = "TAG"; // Sunucunun tagı.
 const tagRole = "627387152837115904"; // Verilecek rolün ID si.
 const channel = guild.channels.cache.find(ch => ch.name === 'tagrol-log'); // Değişimlerin paylaşılacağı günlük kanalı adı.

 // Kullanıcı adı değişmişse işleme devam edeceğiz.
 if (newMember.nickname && oldMember.nickname !== newMember.nickname) {
 // Eğer kullanıcı adında belirlediğimiz TAG var ise ve rol atanmamış ise işleme devam edeceğiz.
 if (newMember.nickname.includes(tag) && !newMember.roles.cache.has(tagRole)) {
 const role = guild.roles.cache.get(tagRole); // Rolü çektik.
 newMember.roles.add(role); // Rolü verdik.
 // Log tuttuğumuz kanala mesajı ayarlıyoruz.
 const tagAdded = new Discord.MessageEmbed()
 .setColor("RANDOM")
 .setDescription(`${newMember.user.tag}, ${tag} tagını belirttiği için ${role.name} rolü verildi.`)
 .setTimestamp();
 channel.send(tagAdded); // Log mesajını gönderdik.
 }
 // Yeni kullanıcı adında tag yok ama rolü var ise.
 else if (!newMember.nickname.includes(tag) && newMember.roles.cache.has(tagRole))
 const role = guild.roles.cache.get(tagRole);
 newMember.roles.remove(role); // Rolü elinden akdık.
 const tagRemoved = new Discord.MessageEmbed()
 .setColor("RANDOM")
 .setDescription(`${newMember.user.tag}, ${tag} tagını sildiği için ${role.name} rolü alındı.`)
 .setTimestamp();
 channel.send(tagRemoved);
 }
 }
});

Bu arada lütfen kod paylaşırken kod bloğu olarak paylaşın. Böylece okuması daha kolay oluyor.
Eki Görüntüle 1805432

Eğer birçok sunucuda kullanılacak ise bu bot tagrole değişkeninin bir isim ile ayarlanması daha uygun olur.

Hocam bunu şimdi kullanıcı adına göremi düzenledin yoksa duruma göremi
Bir de ben hakkımdadan bahsetmiyorum zaten durumdan bahsediyorum o yasak değil sanırım.
 
Hocam bunu şimdi kullanıcı adına göremi düzenledin yoksa duruma göremi
Bir de ben hakkımdadan bahsetmiyorum zaten durumdan bahsediyorum o yasak değil sanırım.
Kullanıcı adına göre çalışıyordu, ben sadece her mesajı değil kullanıcı hareketlerini izleyecek şekilde düzenledim. Bu sayede birisi rolü aldıktan sonra kullanıcı adını değiştirse bile rolün alınmaması durumu ortadan kalkmış oldu.

Dökümanlarda kullanıcının özel durumu ile ilgili bir şey bulamadım. Sanırım bunun için de erişim izni yok. Bazı yerlerde presence verisinden geliyor diye okudum ancak presence verisinde de bulamadım.

 

Yeni konular

Geri
Yukarı