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.chat.ChatType;
import org.spongepowered.api.text.format.TextColors;

public class AdminMessageChannel implements MessageChannel {

    @Override
    public Optional<Text> transformMessage(Object sender, MessageReceiver recipient,
                Text original, ChatType type) {
        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;
import org.spongepowered.api.text.channel.MessageChannel;

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.Collection;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.WeakHashMap;

import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.channel.MessageReceiver;
import org.spongepowered.api.text.channel.MutableMessageChannel;
import org.spongepowered.api.text.chat.ChatType;
import org.spongepowered.api.text.format.TextColors;

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, ChatType type) {
        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.

Note that an abstract implementation for MutableMessageChannels exists in SpongeAPI as AbstractMutableMessageChannel. Also note that our members do not persist. If a player were to leave the server, they would be removed from the set.

Ü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.