Pano Backend'ini Genişletme
Pano'nun Backend'ini Genişletme (Önerilen)
Minecraft eklentinizin gönderdiği bir istek, Pano'da bir şey onu işleyene kadar hiçbir şey yapmaz. Her istek için bir sunucu olayı içeren bir Pano eklentisi (backend tarafında) oluşturun.
Pano Eklenti Yapısı
Bir sunucu olayı ServerEvent<Request, Response> sınıfını genişletir. Olay adı, sınıf adının Event çıkarılmış, büyük harfli snake case halidir; yani MyPlayerStatsEvent, MY_PLAYER_STATS isteğini işler. Yanıtın adı, sınıf adının EventResponse çıkarılmış halidir. Pano isteği Gson ile doldurur: her property'ye varsayılan bir değer verin.
// In your Pano plugin (backend)
import com.panomc.platform.api.PanoPlugin
import com.panomc.platform.db.model.Server
import com.panomc.platform.server.ServerEvent
import com.panomc.platform.server.ServerEventRequest
import com.panomc.platform.server.ServerEventResponse
import com.panomc.platform.server.ServerManager
// MY_PLAYER_JOIN: no answer
class MyPlayerJoinEventRequest(
val player: String = "",
val uuid: String = ""
) : ServerEventRequest()
class MyPlayerJoinEvent : ServerEvent<MyPlayerJoinEventRequest, ServerEventResponse>() {
override suspend fun handle(request: MyPlayerJoinEventRequest, server: Server): ServerEventResponse? {
// Store in database, trigger events, etc.
return null
}
}
// MY_PLAYER_STATS: answered
class MyPlayerStatsEventRequest(val uuid: String = "") : ServerEventRequest()
data class MyPlayerStatsEventResponse(
val kills: Int = 0,
val deaths: Int = 0
) : ServerEventResponse()
class MyPlayerStatsEvent : ServerEvent<MyPlayerStatsEventRequest, MyPlayerStatsEventResponse>() {
override suspend fun handle(request: MyPlayerStatsEventRequest, server: Server): MyPlayerStatsEventResponse {
// Load the stats of request.uuid from your own tables
return MyPlayerStatsEventResponse(kills = 12, deaths = 3)
}
}
class MyIntegrationPanoPlugin : PanoPlugin() {
private val events = listOf<ServerEvent<*, *>>(MyPlayerJoinEvent(), MyPlayerStatsEvent())
override suspend fun onStart() {
val serverManager = applicationContext.getBean(ServerManager::class.java)
events.forEach {
serverManager.unregisterEvent(it)
serverManager.registerEvent(it)
}
}
override suspend fun onStop() {
val serverManager = applicationContext.getBean(ServerManager::class.java)
events.forEach { serverManager.unregisterEvent(it) }
}
}Yanıtlanacak bir şey yoksa null döndürün. server, isteği gönderen Minecraft sunucusudur; bağlantı kimliği doğrulanmış olduğundan ona güvenebilirsiniz.
Pano'dan Minecraft'a Mesaj Gönderme
ServerManager.sendMessage, bağlı bir sunucuya mesaj gönderir:
import com.panomc.platform.server.PlatformMessage
// Sent as the message PLAYER_REWARD
data class PlayerRewardMessage(
val playerName: String,
val reward: String,
val amount: Int
) : PlatformMessage
// false when the server is not connected
val sent: Boolean = serverManager.sendMessage(serverId, PlayerRewardMessage("Steve", "coins", 100))WARNING
Pano MC Eklentisi, gönderilen bir mesajı yalnızca kendi yerleşik işleyicilerine iletir; bu yüzden başka bir Minecraft eklentisi PLAYER_REWARD mesajını hiç görmez. Eklentinize bir şey ulaştırmak için onun sormasını sağlayın: sunucudan bir istek gönderin (örneğin birkaç saniyede bir) ve bekleyenleri yanıtta döndürün.
Güvenlik En İyi Uygulamaları
- Tüm Verileri Doğrulayın — Gelen verilere doğrulama olmadan asla güvenmeyin
- Pano'nun Şifrelemesini Kullanın — Sunucu bağlantısındaki mesajlar otomatik olarak AES-256-GCM ile şifrelenir
- İzinleri Kontrol Edin — İşlemleri yürütmeden önce kullanıcı izinlerini doğrulayın
- Girişleri Temizleyin — Enjeksiyon saldırılarını önleyin
- Hız Sınırlama — Sık işlemler için hız sınırları uygulayın
- Hata Yönetimi — Hataları her zaman düzgün bir şekilde ele alın