Mesaj Kanalları
Sponge’da, iletilerin gönderilebileceği her nesne MessageReceiver arabirimini uygular. MessageChannel, istenilen sayıda MessageReceiver
’a mesaj gönderebilen ve hatta mesajın alıcısına özel biçimlendirme gibi işlemleri yapabilen bir cihazdır.
Mesaj Alıcılarını Seçme
MessageChannel
arayüzünde, sık kullanılan kanalları elde etmek veya oluşturmak için kullanılabilen sabitler ve statik yöntemler vardır. Ayrıca bir MessageChannel
oluşturmak için kullanılabilecek diğer sınıflar ve arabirimler vardır AbstractMutableMessageChannel ve MutableMessageChannel. Bunların tam listesi şu adreste bulunabilir org.spongepowered.api.text.channel ve alt paketleri.
Yayınlanıyor
En yaygın kanal, yayın kanalı olacaktır. Server#getBroadcastChannel() yöntemi veya MessageChannel#TO_PLAYERS veya MessageChannel#TO_ALL sabiti üzerinden Server dan elde edilebilir. Tek fark, TO_ALL
, sunucuya bağlı her oyuncuyu değil, aynı zamanda Console
sunucusunu da içermesidir.
GetBroadcastChannel()
tarafından döndürülen kanal genellikle MessageChannel.TO_ALL
kanalı olur, ancak :javadoc:`Server#setBroadcastChannel(MessageChannel)`yöntemi kullanılarak farklı bir kanal ayarlanabilir.
Sabit Liste MessageReceivers Gönderme
Bağlanan tüm oyunculara değil elle seçilen bazı alıcılara mesaj göndermek de mümkündür. Bu, amaçlanan alıcıların listesini :javadoc: MessageChannel # fixed (MessageReceiver …) yöntemine geçirilerek yapılabilir. Diğer birçok kanaldan farklı olarak, alıcılar listesi bir şey gönderildiğinde dinamik olarak oluşturulmaz ancak varlığın geri kalanında statik kalır. Bununla birlikte, saklanan referanslar * zayıf *. Bunun anlamı, örneğin bir oyuncunun bağlantısı kesilir ve ilgili :javadoc: Player nesnesi Java’nın * çöp toplayıcı * tarafından kaldırılırsa, o oyuncu da kanalların alıcı listesinden kaybolur demektir.
Yetki-tabanlı seçim
Belirli bir yetki alanı olan tüm alıcılara bir kanal oluşturmak da mümkündür. Kanal, MessageChannel#permission(String) yönteminden alınır; bu değişken argüman olup olmadığını kontrol etme iznine sahiptir. Daha sonra bir mesaj bu kanaldan gönderildiğinde, verilen izinlere sahip olan PermissionService’den tüm konuları alacaktır.
Kanalları Birleştirme
Birden çok kanalı birine birleştirmek de mümkündür. Bu, tüm kanalları MessageChannel#combined(MessageChannel…) yöntemine geçirerek yapılabilir. Ortaya çıkan kanal, mesajları kombine kanallardan en az birinin hedeflediği her alıcıya iletir.
Mesaj gönder
Bir ‘’MessageChannel’’ elde ettikten sonra :javadoc:’MessageChannel#send(Object, Text)’ yöntemi vasıtasıyla mesaj gönderebilirsiniz. Bu yöntem, :javadoc:’MessageChannel#send(Text)’ yönteminde tercih edilir, çünkü ‘’Object’’ tanımlama veya diğer çeşitli eylemleri gerçekleştirmek için kullanılabilir. Alternatif olarak, mesajın gönderileceği yeri belirtmek için bir :javadoc:’ChatType’ kullanabilirsiniz. Kullanımak için :javadoc:’MessageChannel#send(Object, Text, ChatType)’ yöntemi bunu gerçekleştirmenizi sağlayacaktır. Kanal daha sonra iletiyi her alıcıya çevirir ve dönüştürülen iletiyi gönderir.
Genişletilmiş Uygulama: Sohbet Kanalları
Mesaj kanalları, sohbet kanalları oluşturmak için kullanılabilecek oldukları için çok kullanışlı bir uygulamaya sahiptir. Örneğin, sahip olmak istediğiniz her sohbet kanalı için bir mesaj kanalı oluşturabilirsiniz. Daha sonra, /join <channel name>
gibi bir kanala bir MessageReceiver
katıldığında, MessageReceiver
’ın MessageChannel
’ını uygun kanala şu ayarı kullanarak basitçe ayarlayın MessageReceiver#setMessageChannel(MessageChannel). Bu, MessageReceiver
’dan gönderilen her mesajın, varsayılan mesaj yerine verilen MessageChannel
’a geçirilmesine neden olur. Alternatif olarak şunları dinleyebilirsiniz MessageChannelEvent ve uygun MessageChannel
öğesini kullanarak ayarlayabilirsiniz MessageChannelEvent#setChannel(MessageChannel). Bu yöntemi null
’e geçirmek, iletinin orijinal MessageChannel’e gönderilmesine neden olan herhangi bir özel kanalın ayarını kaldıracaktır.
Mesajları dönüştürme
Mesajı istediğiniz gibi değiştirmek için ‘ ‘MessageChannel’ ‘ dan geçen tüm ‘ ‘Text’ ‘ lerde filtre uygulayabilirsiniz. Bu, ‘ ‘MessageChannel`` ı uzatarak ve :javadoc:` MessageChannel # transformMessage (Object, MessageReceiver, Text, ChatType)` metodunu aşağıdaki gosterildiği gibi kullanarak mümkündür.
Örnek: Mesajları Dönüştürme
Aşağıdaki kod parçası varsayılan ‘’transformMessage’’ yöntemini geçersiz kılan bir ‘’AdminMessageChannel’’ sınıfını tanımlar. Yeni ‘’transformMessage’’ yöntemi orijinal mesajı alacak ve mesajın önüne bir kırmızı ‘’[Admin]’’etiketi ekleyecektir.
import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.channel.MessageChannel;
import org.spongepowered.api.text.channel.MessageReceiver;
import org.spongepowered.api.text.format.TextColors;
public class AdminMessageChannel implements MessageChannel {
@Override
public Optional<Text> transformMessage(Object sender, MessageReceiver recipient,
Text original) {
Text text = original;
text = Text.of(TextColors.RED, "[Admin]", TextColors.RESET, text);
return Optional.of(text);
}
@Override
public Collection<MessageReceiver> getMembers() {
return Collections.emptyList();
}
}
Unutmayın, başka bir alıcı tanımlamak istemiyoruz, bu yüzden MessageChannel#getMembers() metodu içerisinden boş bir derlemeye dönüyoruz.
MessageChannel
kombinasyonunun yetenekleri sayesinde, yeni oluşturulan AdminMessageChannel
’ımızı başka MessageChannel
ile birleştirebiliriz. Artık bir oyuncu myplugin.admin
izniyle katılırsa, iletilerinin gönderildiği MessageChannel
’ı edineceğiz, onu bir AdminMessageChannel
ile birleştirip, birleştirilen kanalı oyuncuya geri getireceğiz. Bu şekilde tüm mesajlar orijinal kanalda belirtilen herkese gönderilir, ancak AdminMessageChannel
eklenmesinden dolayı, kırmızı bir [Admin]
etiketi öneklenecektir.
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.network.ClientConnectionEvent;
private AdminMessageChannel adminChannel = new AdminMessageChannel();
@Listener
public void onClientConnectionJoin(ClientConnectionEvent.Join event) {
Player player = event.getTargetEntity();
if(player.hasPermission("myplugin.admin")) {
MessageChannel originalChannel = event.getOriginalChannel();
MessageChannel newChannel = MessageChannel.combined(originalChannel,
adminChannel);
player.setMessageChannel(newChannel);
}
}
Bunun, bir oyuncuyla ilgili olan ‘all’ mesajlar olarak alacağına dikkat edin. Ölüm mesajları, izin mesajları vb. içerir. Yalnızca tüm ‘chat’ mesajlarının önüne gelmek istiyorsanız, şunları dinlemelisiniz :javadoc:’MessageChannelEvent.Chat’ ve kanalı oyuncu yerine olaya ayarlayın. Bu, ‘’MessageChannelEvent.Chat’’olayına ‘’event.setChannel(newChannel)’’ kullanılarak yapılır. Olaydan oyuncuya izinleri kontrol etmek için olayın “Cause” ile bir “Player” getirmeniz gerekecektir. Bu, aşağıda gösterilmiştir:
Optional<Player> playerOptional = event.getCause().<Player>first(Player.class);
Nedenler hakkında daha fazla bilgi için causes page.
Not
Farklı mesaj dönüşümlerini tanımlayan birden fazla ‘’MessageChannel’’s birleştirirken, ‘’Text’’, ‘’MessageChannel’’s iletilen ‘’MessageChannel#combined(MessageChannel… channels)’’ aktarılacağı yönteme sırayla dönüştürülecektir. ‘’Optional’’ boşluğuna neden olan tüm dönüşümlerin, zincirdeki son kanal tarafından yapılmadığı takdirde ihmal edileceğini unutmayın.
Değişken Mesaj Kanalları
Bir :javadoc:’MutableMessageChannel’ kanalımızdan gönderilen mesajları kimlerin alabileceğini değiştirme yöntemleri içerir. Bu nedenle, üyelerimizin eylemlerini gerçekleştirmek için yöntemler uygulamak zorundayız. Bunu yapmak için, ‘’MutableMessageChannel’’ uygulayacak olan ‘’MutableAdminMessageChannel’’ isimli bir sınıf oluşturacağız.
import java.util.Set;
import java.util.WeakHashMap;
import org.spongepowered.api.text.channel.MutableMessageChannel;
public class MutableAdminMessageChannel implements MutableMessageChannel {
private Set<MessageReceiver> members;
public MutableAdminMessageChannel() {
this(Collections.emptySet());
}
public MutableAdminMessageChannel(Collection<MessageReceiver> members) {
this.members = Collections.newSetFromMap(new WeakHashMap<>());
this.members.addAll(members);
}
@Override
public Collection<MessageReceiver> getMembers() {
return Collections.unmodifiableSet(this.members);
}
@Override
public boolean addMember(MessageReceiver member) {
return this.members.add(member);
}
@Override
public boolean removeMember(MessageReceiver member) {
return this.members.remove(member);
}
@Override
public void clearMembers() {
this.members.clear();
}
@Override
public Optional<Text> transformMessage(Object sender, MessageReceiver recipient,
Text original) {
Text text = original;
if(this.members.contains(recipient)) {
text = Text.of(TextColors.RED, "[Admin]", TextColors.RESET, text);
}
return Optional.of(text);
}
}
`` AdminMessageChannel`` ve yeni `` MutableAdminMessageChannel`` arasındaki temel fark mesajı dönüştürmeden önce alıcının üye listesinde olup olmadığını kontrol etmemizdir. Eğer öyleyse, gönderilen mesajı, kırmızı [Admin]
önekini ekleyerek değiştirebiliriz. `` GetMembers () `` yöntemimizde, değişmez bir küme döndürürüz, böylece set yalnızca MutableAdminMessageChannel`mizdeki uygun yöntemlerle değiştirilebilir.
‘’MutableMessageChannel’’ için soyut bir uygulamanın Sponge API’sinde “AbstractMutableMessageChannel’’ olarak var olduğunu unutmayın. Ayrıca, üyelerimizin devamlılığına dikkat edin. Oyuncu devam etmezse atılır.
Üyeleri Değiştirme
‘’MutableAdminMessageChannel’’ tam olarak faydalanabilmek için, kanaldan üye ekleyebilir veya kanaldan üyeleri kaldırabilmeliyiz. Bunu yapmak için üye kümesine bir üye eklememiz veya üye kümesinden bir üye eklememiz gerektiğinde, daha önce uyguladığımız yöntemler :javadoc:’MutableMessageChannel#addMember(MessageReceiver)’ ve :javadoc:’MutableMessageChannel#removeMember(MessageReceiver)’ yöntemlerini basitçe arayabiliriz.