- 29 Şub 2020
- 538
- 575
Merhaba değerli TurkHackTeam ailesi, Bu gün Java kullanarak discord için moderasyon botu yapmayı göstereceğim
Şimdi build.gradle'ımız şuna benziyor:
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 komutumuz şöyle görünür:
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
Softban
Mute
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:
Şimdi onGuildMessageReceived(GuildMessageReceivedEvent) yöntemini geçersiz kılalım:
Bir de küfür listesi ekleyelim:
Şimdi küfür var mı bir bakalım ve varsa mesajı silelim:
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]
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.
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:
Ş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.
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]