Java'da Tüm Dünyadaki Herkesin Kullanması İçin Discord Moderasyon Botu Nasıl Yapılır?

GhostWins

International Senior Moderator
29 Şub 2020
384
235
London
Merhaba değerli TurkHackTeam ailesi, Bu gün Java kullanarak discord için moderasyon botu yapmayı göstereceğim

1.Adım
Yeni bir proje oluşturun ve JDA'yı bağımlılık olarak ekleyin

Bu eğitimde, komutlarımızı işlemek için JDA-Utilities kullanacağız, bu yüzden bunu bir bağımlılık olarak eklediğinizden emin olun.

Şimdi build.gradle'ımız şuna benziyor:

Kod:
plugins {
    id'java'
id'application'
id'com.github.johnrengelman.shadow' version '2.0.1'
}group 'com.example'
version '1.0-SNAPSHOT'mainClassName = 'com.example.jda.Bot'version '1.0'sourceCompatibility = 1.8repositories {
    jcenter()
}dependencies {
    compile 'net.dv8tion:JDA:3.5.0_331'
compile 'com.jagrosh:jda-utilities:2.0'
}compileJava.options.encoding = 'UTF-8'


2.Adım
Şimdi, komut işlememizi yürütmek için JDA-Utilities' CommandClient'i kullanacağız.
Temel bir komut şöyle görünür:
Kod:
public class ModBot {
    public static void main(String[] args) throws LoginException {
CommandClientBuilder commandClientBuilder = new CommandClientBuilder();        //our prefix is !!
        commandClientBuilder.setPrefix("!!");        //"Type !!help"
        commandClientBuilder.useDefaultGame();        commandClientBuilder.addCommand(new HelloWorldCommand());        new JDABuilder(AccountType.BOT)
                .setToken("your-token-goes-here")
.addEventListener(commandClientBuilder.build())
.buildAsync();
}    public static class HelloWorldCommand extends Command {
        public HelloWorldCommand() {
this.name = "helloworld";
this.aliases = new String[]{"hw"};
this.help = "says hello";
}        @Override
        protected void execute(CommandEvent commandEvent) {
commandEvent.reply("Merhaba");
}
}


GuildController
JDA'daki tüm mod eylemleri (yasaklama, tekme atma, rol ekleme veya kaldırma, sunucu sessize alma, sunucu sağırlaştırma vb.) GuildController sınıfı aracılığıyla yapılır.

RestActions

Discord'un REST API'si ile etkileşime giren tüm JDA yöntemleri, RestAction sınıfının bir örneğini döndürür.

RestAction, yapılacak bir isteği temsil eder. Ancak, istek yalnızca siz aradığınızda yürütülür. queue(), complete(), veya submit() RestAction nesnesinde. Bu yöntemlerden birini çağırmazsanız, işlem asla yürütülmez ve botunuz çalışmaz.

Mümkün olduğunda, kullanmayı deneyin queue(),

yöntemi ve mevcut iş parçacığını engellemedikleri için aşırı yükler), bu nedenle diğer işlemler yavaşlamaz.



Kick

Şimdilik, bir kick komutu yapalım. !!kick @Kişi olarak yürütülür, burada Kişi sunucudan atmak istediğiniz kişidir. Bu komut için Message#getMentionedMembers() ve GuildController#kick yöntemlerini kullanacağız.

Kick komutumuz şöyle görünür:



Kod:
@Override
protected void execute(CommandEvent commandEvent) {
Guild guild = commandEvent.getGuild();    //if we're not in a guild we can't kick anyone
    if(guild == null) {
commandEvent.reply("You must run this command in a server");
return;
}    Member author = commandEvent.getMessage().getMember();    //the author can't kick people
    if(!author.hasPermission(Permission.KICK_MEMBERS)) {
commandEvent.reply("You don't have permission to kick people!");
return;
}    List<Member> mentionedMembers = commandEvent.getMessage().getMentionedMembers();    if(mentionedMembers.isEmpty()) {
        commandEvent.reply("You must mention who you want to be kicked");
return;
}    guild.getController().kick(mentionedMembers.get(0)).queue(success->{
        commandEvent.reply("Successfully kicked " + mentionedMembers.get(0).getUser().getName());
}, error->{
commandEvent.reply("Unable to kick " + mentionedMembers.get(0).getUser().getName() + ": " + error);
});
}

x->{} sözdiziminin ne olduğunu merak ediyor olabilirsiniz. Bilmiyorsanız, bunlar javascript'in kapanışlarına veya python'un lambdalarına benzeyen lambda ifadeleridir.


Ban
Yasaklamanın yolu, ban'lama yönteminize neredeyse eşittir, ancak GuildController#ban() yöntemine vermeniz gereken ek bir argüman var, bu da yasaklı kişinin mesajlarının ne kadar silineceğidir.

Softban

Kod:
guild.getController().ban(member, 7 /* delete all messages from the member in the last week */).queue(done->{
    guild.getController().unban(member.getUser()).queue(done2->{
        commandEvent.reply("Softbanned " + member.getUser().getName() + "#" + member.getUser().getDiscriminator());
    }, error->{
        commandEvent.reply("Error unbanning: " + error);
    };
}, error->{
    commandEvent.reply("Error banning: " + error);
});


Mute

Sesi kapatmak için bir Mute rolüne ihtiyacımız olacak. Şimdilik, kişiye bulduğumuz Muted adlı ilk rolü vereceğiz.

Kod:
Guild guild = ...
GuildController controller = guild.getController();List<Member> mentionedMembers = commandEvent.getMessage().getMentionedMembers();if(mentionedMembers.isEmpty()) {
    commandEvent.reply("You must mention who you want to be kicked");
return;
}Member toMute = mentionedMembers.get(0);Role muteRole = guild.getRoles().stream().filter(r->r.getName().equals("Muted")).findFirst().orElse(null);if(muteRole == null) {
    commandEvent.reply("No role named 'Muted' found");
return;
}controller.addSingleRoleToMember(toMute, muteRole).queue(success->{
    commandEvent.reply("Successfully muted " + toMute.getUser().getName());
}, error->{
commandEvent.reply("Unable to mute " + toMute.getUser().getName() + ": " + error);
});


Tempmute
Birinin sesini 1 saatliğine sessize alır, ardından sesini açarız. Mute komutumuzu değiştirelim:

Kod:
controller.addSingleRoleToMember(toMute, muteRole).queue(success->{
    commandEvent.reply("Successfully muted " + toMute.getUser().getName());
    controller.removeSingleRoleFromMember(toMute, muteRole).queueAfter(1, TimeUnit.HOURS, success2->{
        commandEvent.reply("Successfully unmuted " + toMute.getUser().getName());
    }, error->{
        commandEvent.reply("Unable to unmute " + toMute.getUser().getName() + ": " + error);
    });
}, error->{
    commandEvent.reply("Unable to mute " + toMute.getUser().getName() + ": " + error);
});

Bu, RestAction#queueAfter yöntemini kullanır; bu, bot yeniden başlatıldığında bekleyen sessize alma işlemlerimizin kaybolacağı anlamına gelir. Yeniden başlatmalarda bile onları takip etmek için, onları bir veritabanına kaydetmemiz gerekir (verileri json dosyalarına kaydetmeyin, bu her zaman geri teper), ancak bu, bu öğreticinin kapsamı dışındadır.

Profanity Protection


Filtremizi oluşturmak için JDA nesnemize yeni bir dinleyici eklememiz gerekecek. Yeni bir sınıf oluşturalım ve ListenerAdapter'ı genişletelim:


Kod:
public class CurseWorldFilter extends ListenerAdapter {}

Şimdi onGuildMessageReceived(GuildMessageReceivedEvent) yöntemini geçersiz kılalım:

Kod:
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {}

Bir de küfür listesi ekleyelim:

Kod:
public class CurseWorldFilter extends ListenerAdapter {
    private static final List<String> CURSE_WORDS = Arrays.asList(
"küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür"
);    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {    }
}
Tabikide buraya küfür, argo vb kelimeler yazamıycağım siz kendiniz değiştirirsiniz.


Şimdi küfür var mı bir bakalım ve varsa mesajı silelim:

Kod:
public class CurseWorldFilter extends ListenerAdapter {
    private static final List<String> CURSE_WORDS = Arrays.asList(
"küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür"
);    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
//get the raw content (what the user typed) and convert to lower case
//this is why we have to put curse words as lower case in the list above
String message = event.getMessage().getContentRaw().toLowerCase();        //for each curse word in the curse words list
        for(String curseWord : CURSE_WORDS) {
//check if the message contains it
if(message.contains(curseWord)) {
//the message contains a curse word
//let's see if we can delete it                //if we don't have permission to delete messages we'll just warn and return
                if(!event.getGuild().getSelfMember().hasPermission(event.getChannel(), Permission.MESSAGE_MANAGE)) {
System.out.println("No permission to delete messages in #" + event.getChannel().getName());
return;
}                //try deleting it
                event.getMessage().delete().queue(ddone->{
//if it was deleted, warn the user
event.getChannel().sendMessage(event.getAuthor().getAsMention() + ", you cannot say that!").queue();
}, error->{
//if we got an error deleting it print it
System.out.println("Error deleting message with curse word");
error.printStackTrace();
});
return;
}
}
}
[CENTER]}

Botumuzu şimdi çalıştırırsak, kötü kelimeleri tamamen görmezden geldiğini fark edeceğiz. Çünkü dinleyiciyi kaydetmedik. Şimdi ana sınıfımıza dönelim ve .addEventListener(commandClientBuilder.build()) öğesini .addEventListener(commandClientBuilder.build(), new CurseWorldFilter()) olarak değiştirelim, böylece botumuz kayıtlı olsun.

Botu tekrar çalıştırın ve artık kötü kelimeleri tespit ettiğini ve onları sildiğini fark edeceksiniz.

İyi Günler.
[/CENTER]
 

'The Wolf

Kıdemli Üye
22 Nis 2021
4,024
2,452
Tanrı dağı
Merhaba değerli TurkHackTeam ailesi, Bu gün Java kullanarak discord için moderasyon botu yapmayı göstereceğim

1.Adım
Yeni bir proje oluşturun ve JDA'yı bağımlılık olarak ekleyin

Bu eğitimde, komutlarımızı işlemek için JDA-Utilities kullanacağız, bu yüzden bunu bir bağımlılık olarak eklediğinizden emin olun.

Şimdi build.gradle'ımız şuna benziyor:

Kod:
plugins {
    id'java'
id'application'
id'com.github.johnrengelman.shadow' version '2.0.1'
}group 'com.example'
version '1.0-SNAPSHOT'mainClassName = 'com.example.jda.Bot'version '1.0'sourceCompatibility = 1.8repositories {
    jcenter()
}dependencies {
    compile 'net.dv8tion:JDA:3.5.0_331'
compile 'com.jagrosh:jda-utilities:2.0'
}compileJava.options.encoding = 'UTF-8'


2.Adım
Şimdi, komut işlememizi yürütmek için JDA-Utilities' CommandClient'i kullanacağız.
Temel bir komut şöyle görünür:
Kod:
public class ModBot {
    public static void main(String[] args) throws LoginException {
CommandClientBuilder commandClientBuilder = new CommandClientBuilder();        //our prefix is !!
        commandClientBuilder.setPrefix("!!");        //"Type !!help"
        commandClientBuilder.useDefaultGame();        commandClientBuilder.addCommand(new HelloWorldCommand());        new JDABuilder(AccountType.BOT)
                .setToken("your-token-goes-here")
.addEventListener(commandClientBuilder.build())
.buildAsync();
}    public static class HelloWorldCommand extends Command {
        public HelloWorldCommand() {
this.name = "helloworld";
this.aliases = new String[]{"hw"};
this.help = "says hello";
}        @Override
        protected void execute(CommandEvent commandEvent) {
commandEvent.reply("Merhaba");
}
}


GuildController
JDA'daki tüm mod eylemleri (yasaklama, tekme atma, rol ekleme veya kaldırma, sunucu sessize alma, sunucu sağırlaştırma vb.) GuildController sınıfı aracılığıyla yapılır.

RestActions

Discord'un REST API'si ile etkileşime giren tüm JDA yöntemleri, RestAction sınıfının bir örneğini döndürür.

RestAction, yapılacak bir isteği temsil eder. Ancak, istek yalnızca siz aradığınızda yürütülür. queue(), complete(), veya submit() RestAction nesnesinde. Bu yöntemlerden birini çağırmazsanız, işlem asla yürütülmez ve botunuz çalışmaz.

Mümkün olduğunda, kullanmayı deneyin queue(),

yöntemi ve mevcut iş parçacığını engellemedikleri için aşırı yükler), bu nedenle diğer işlemler yavaşlamaz.



Kick

Şimdilik, bir kick komutu yapalım. !!kick @Kişi olarak yürütülür, burada Kişi sunucudan atmak istediğiniz kişidir. Bu komut için Message#getMentionedMembers() ve GuildController#kick yöntemlerini kullanacağız.

Kick komutumuz şöyle görünür:



Kod:
@Override
protected void execute(CommandEvent commandEvent) {
Guild guild = commandEvent.getGuild();    //if we're not in a guild we can't kick anyone
    if(guild == null) {
commandEvent.reply("You must run this command in a server");
return;
}    Member author = commandEvent.getMessage().getMember();    //the author can't kick people
    if(!author.hasPermission(Permission.KICK_MEMBERS)) {
commandEvent.reply("You don't have permission to kick people!");
return;
}    List<Member> mentionedMembers = commandEvent.getMessage().getMentionedMembers();    if(mentionedMembers.isEmpty()) {
        commandEvent.reply("You must mention who you want to be kicked");
return;
}    guild.getController().kick(mentionedMembers.get(0)).queue(success->{
        commandEvent.reply("Successfully kicked " + mentionedMembers.get(0).getUser().getName());
}, error->{
commandEvent.reply("Unable to kick " + mentionedMembers.get(0).getUser().getName() + ": " + error);
});
}

x->{} sözdiziminin ne olduğunu merak ediyor olabilirsiniz. Bilmiyorsanız, bunlar javascript'in kapanışlarına veya python'un lambdalarına benzeyen lambda ifadeleridir.


Ban

Yasaklamanın yolu, ban'lama yönteminize neredeyse eşittir, ancak GuildController#ban() yöntemine vermeniz gereken ek bir argüman var, bu da yasaklı kişinin mesajlarının ne kadar silineceğidir.

Softban

Kod:
guild.getController().ban(member, 7 /* delete all messages from the member in the last week */).queue(done->{
    guild.getController().unban(member.getUser()).queue(done2->{
        commandEvent.reply("Softbanned " + member.getUser().getName() + "#" + member.getUser().getDiscriminator());
    }, error->{
        commandEvent.reply("Error unbanning: " + error);
    };
}, error->{
    commandEvent.reply("Error banning: " + error);
});


Mute

Sesi kapatmak için bir Mute rolüne ihtiyacımız olacak. Şimdilik, kişiye bulduğumuz Muted adlı ilk rolü vereceğiz.

Kod:
Guild guild = ...
GuildController controller = guild.getController();List<Member> mentionedMembers = commandEvent.getMessage().getMentionedMembers();if(mentionedMembers.isEmpty()) {
    commandEvent.reply("You must mention who you want to be kicked");
return;
}Member toMute = mentionedMembers.get(0);Role muteRole = guild.getRoles().stream().filter(r->r.getName().equals("Muted")).findFirst().orElse(null);if(muteRole == null) {
    commandEvent.reply("No role named 'Muted' found");
return;
}controller.addSingleRoleToMember(toMute, muteRole).queue(success->{
    commandEvent.reply("Successfully muted " + toMute.getUser().getName());
}, error->{
commandEvent.reply("Unable to mute " + toMute.getUser().getName() + ": " + error);
});

Tempmute​

Birinin sesini 1 saatliğine sessize alır, ardından sesini açarız. Mute komutumuzu değiştirelim:​

Kod:
controller.addSingleRoleToMember(toMute, muteRole).queue(success->{
    commandEvent.reply("Successfully muted " + toMute.getUser().getName());
    controller.removeSingleRoleFromMember(toMute, muteRole).queueAfter(1, TimeUnit.HOURS, success2->{
        commandEvent.reply("Successfully unmuted " + toMute.getUser().getName());
    }, error->{
        commandEvent.reply("Unable to unmute " + toMute.getUser().getName() + ": " + error);
    });
}, error->{
    commandEvent.reply("Unable to mute " + toMute.getUser().getName() + ": " + error);
});

Bu, RestAction#queueAfter yöntemini kullanır; bu, bot yeniden başlatıldığında bekleyen sessize alma işlemlerimizin kaybolacağı anlamına gelir. Yeniden başlatmalarda bile onları takip etmek için, onları bir veritabanına kaydetmemiz gerekir (verileri json dosyalarına kaydetmeyin, bu her zaman geri teper), ancak bu, bu öğreticinin kapsamı dışındadır.

Profanity Protection


Filtremizi oluşturmak için JDA nesnemize yeni bir dinleyici eklememiz gerekecek. Yeni bir sınıf oluşturalım ve ListenerAdapter'ı genişletelim:



Kod:
public class CurseWorldFilter extends ListenerAdapter {}

Şimdi onGuildMessageReceived(GuildMessageReceivedEvent) yöntemini geçersiz kılalım:

Kod:
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {}

Bir de küfür listesi ekleyelim:

Kod:
public class CurseWorldFilter extends ListenerAdapter {
    private static final List<String> CURSE_WORDS = Arrays.asList(
"küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür"
);    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {    }
}
Tabikide buraya küfür, argo vb kelimeler yazamıycağım siz kendiniz değiştirirsiniz.


Şimdi küfür var mı bir bakalım ve varsa mesajı silelim:

Kod:
public class CurseWorldFilter extends ListenerAdapter {
    private static final List<String> CURSE_WORDS = Arrays.asList(
"küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür", "küfür"
);    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
//get the raw content (what the user typed) and convert to lower case
//this is why we have to put curse words as lower case in the list above
String message = event.getMessage().getContentRaw().toLowerCase();        //for each curse word in the curse words list
        for(String curseWord : CURSE_WORDS) {
//check if the message contains it
if(message.contains(curseWord)) {
//the message contains a curse word
//let's see if we can delete it                //if we don't have permission to delete messages we'll just warn and return
                if(!event.getGuild().getSelfMember().hasPermission(event.getChannel(), Permission.MESSAGE_MANAGE)) {
System.out.println("No permission to delete messages in #" + event.getChannel().getName());
return;
}                //try deleting it
                event.getMessage().delete().queue(ddone->{
//if it was deleted, warn the user
event.getChannel().sendMessage(event.getAuthor().getAsMention() + ", you cannot say that!").queue();
}, error->{
//if we got an error deleting it print it
System.out.println("Error deleting message with curse word");
error.printStackTrace();
});
return;
}
}
}
[CENTER]}

Botumuzu şimdi çalıştırırsak, kötü kelimeleri tamamen görmezden geldiğini fark edeceğiz. Çünkü dinleyiciyi kaydetmedik. Şimdi ana sınıfımıza dönelim ve .addEventListener(commandClientBuilder.build()) öğesini .addEventListener(commandClientBuilder.build(), new CurseWorldFilter()) olarak değiştirelim, böylece botumuz kayıtlı olsun.

Botu tekrar çalıştırın ve artık kötü kelimeleri tespit ettiğini ve onları sildiğini fark edeceksiniz.

İyi Günler.
[/CENTER]
Elinize Sağlık.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.