FiveM için Discord beyaz liste: oyuncuları Discord rolüne göre izin ver

FiveM sunucunuz için Discord rolü beyaz listesi oluşturun: playerConnecting deferrals ile, Discord tanımlayıcı, REST API aracılığıyla bot rol kontrolü ve güvenli token.

Yalnızca belirli Discord rolü olan oyuncuların katılmasını istiyorsunuz: üyeler, destekleyiciler, beyaz listeli. FiveM'de yerleşik Discord kontrolü yok, bu nedenle playerConnecting içinde birini eklersiniz: oyuncunun Discord tanımlayıcısını okuyun, bot aracılığıyla Discord'dan rollerini isteyin ve bağlantıyı kabul edin veya reddedin.

Üç şeye ihtiyacınız vardır: sunucunuzda Discord bot'u, FiveM sunucusundaki betik ve token için güvenli bir yer.

Nasıl çalışır

  1. Oyuncu bağlanır. FiveM playerConnecting tetikler ve tanımlayıcı verir.
  2. Deferrals ile bağlantıyı duraklatırsınız (bkz. playerConnecting ve deferrals).
  3. Sunucunuz Discord REST API'sine sorar: bu kullanıcı guildde mi ve hangi rolleri var?
  4. Onları içeri almak için deferrals.done() veya reddetmek için deferrals.done('reason') çağırırsınız.

Bot oluşturun

  1. Discord geliştirici portalını açın ve bir uygulamayı oluşturun, sonra bir Bot ekleyin.
  2. Bot token'ını kopyalayın. Şifre gibi davranın.
  3. Kimlik tarafından bir üyeyi aramak için ayrıcalıklı niyet gerekmez. (Sunucu Üyeleri Amacı yalnızca bot bir bot'a tüm üyeleri listelemesi veya üye olaylarını dinlemesi gerekirse önemlidir.)
  4. Bot'u Discord sunucunuza davet edin. Yönetici hakları olması gerekmiyor, yalnızca üye olması gerekiyor.
  5. Discord'da Geliştirici Modunu açın, sonra sunucu (guild) ID'sini ve beyaz liste rolünün rol ID'sini kopyalayın.

Token'ı koddan uzak tutun

server.cfg'de convar olarak ayarlayın veya asla paylaşmayacağınız bir cfg dosyasında:

cfg
set discord_bot_token "paste-token-here"
set discord_guild_id "123456789012345678"
set discord_whitelist_role "123456789012345679"

setr değil set kullanın. setr convar'ı her istemciye çoğaltılır, token oyunculara sızdıracak.

Betiğe okuyun:

lua
local TOKEN = GetConvar('discord_bot_token', '')
local GUILD = GetConvar('discord_guild_id', '')
local ROLE  = GetConvar('discord_whitelist_role', '')

Dikkat: token bir ekran görüntüsünde, destek iletisinde veya genel depoda bulunursa, hemen geliştirici portalında sıfırlayın.

Discord tanımlayıcısını okuyun

Oyuncu tanımlayıcı discord:123456789012345678 gibi görünür. Onları döngü yapın ve ön eki kesin:

lua
local function getDiscordId(src)
    for _, id in ipairs(GetPlayerIdentifiers(src)) do
        if id:sub(1, 8) == 'discord:' then
            return id:sub(9)
        end
    end
end

Discord'dan rolleri isteyin

Uç nokta GET https://discord.com/api/v10/guilds/{guild.id}/members/{user.id}, Authorization: Bot <token> ile yetkilendirilmiş. Yanıt rol kimliklerinin roles dizisini içerir.

lua
local function hasWhitelistRole(discordId, cb)
    PerformHttpRequest(
        ('https://discord.com/api/v10/guilds/%s/members/%s'):format(GUILD, discordId),
        function(status, body)
            if status == 200 then
                local member = json.decode(body)
                for _, role in ipairs(member.roles or {}) do
                    if role == ROLE then return cb(true) end
                end
                return cb(false)
            elseif status == 404 then
                return cb(false, 'not_in_guild')
            end
            cb(nil, status) -- rate limit or Discord error
        end,
        'GET', '',
        { ['Authorization'] = 'Bot ' .. TOKEN }
    )
end

404 kullanıcı Discord sunucunuzun üyesi olmadığını anlamına gelir. 429 veya 5xx gibi diğer durum "hayır" değil yolda bir sorundur.

Bağlantı işleyicisi

lua
AddEventHandler('playerConnecting', function(name, setKickReason, deferrals)
    local src = source
    deferrals.defer()
    Wait(0)

    deferrals.update('Checking your Discord role...')

    local discordId = getDiscordId(src)
    if not discordId then
        return deferrals.done('Open the Discord app on your PC, then reconnect.')
    end

    hasWhitelistRole(discordId, function(ok, info)
        if ok then
            deferrals.done()
        elseif ok == false and info == 'not_in_guild' then
            deferrals.done('Join our Discord server first.')
        elseif ok == false then
            deferrals.done('You do not have the whitelist role.')
        else
            deferrals.done('Could not reach Discord (' .. tostring(info) .. '). Try again in a moment.')
        end
    end)
end)

source içinde yerel olarak kaydedin: Wait sonra, global source artık bu oyuncuya işaret etmez.

Hız sınırları ve önbellekleme

Discord API isteklerini rota ve küresel olarak sınırlar. Yeniden başlatma sırasında, birçok oyuncu aynı anda yeniden bağlanır ve her biri bir istek tetikler. İki basit koruma:

  • Sonuçları Discord ID başına birkaç dakika önbelleğe alın, bu nedenle yeniden deneyen oyuncu API'yi tekrar çağırmazsa.
  • Tutamaç 429.Dysord Retry-After başlığıyla yanıt verir. "Tekrar deneyin" iletisini gösterin ve üzerinde döngü yapmayın.
lua
local cache = {}
local TTL = 5 * 60 * 1000

local function cachedCheck(discordId, cb)
    local hit = cache[discordId]
    if hit and GetGameTimer() - hit.at < TTL then
        return cb(hit.ok)
    end
    hasWhitelistRole(discordId, function(ok, info)
        if ok ~= nil then cache[discordId] = { ok = ok, at = GetGameTimer() } end
        cb(ok, info)
    end)
end

İşleyicide hasWhitelistRole yerine cachedCheck kullanın. Önbelleğe alınmış "evet" kaldırılan rol beş dakika daha uzun çalışır, beyaz liste için iyidir.

Diğer noktalar

  • Açık başarısız olmayın. Discord kapalı ise, kabul edilebilir olduğuna karar verdikçe açık bir ileti ile reddedin veya herkesi içeri bırakmayın.
  • Personel bypass. Yöneticilerin rol olmadan katılmasını istiyorsanız, tanımlayıcılarını bir listeyle karşılaştırın.
  • Discord olmayan oyuncular tanımlayıcı alamaz. Yukarıdaki iletiniz onlara ne yapacağını söyler.
  • Bir hileci için iyi olan bir şeyi engellemek için, rolü kaldırmak yerine onları yasakla. Bkz. txAdmin ile denetim.

Kontrol Listesi

Semptom Çözüm
discord: tanımlayıcısı yok Oyuncunun Discord uygulaması çalışıyor ve oturum açmalı
Discord'dan 401 Yanlış veya sıfırlanmış bot token veya eksik Bot ön eki
Discord'dan 403 Bot bu sunucuda değil veya token başka bot'a ait
Discord'dan 404 Kullanıcı Discord sunucunuzda değil
Discord'dan 429 Hız sınırı: sonuçları önbelleğe alın ve yeniden deneme iletisini gösterin
Token oyunculara görünür setr değil set kullanın ve paylaşılan dosyaların dışında tutun
Oyuncu "Kontrol etme" da takılmış Her kod yolu deferrals.done ile bitmeli

Kısa yanıtlar

Oyuncunun katılmak için Discord açık olması gerekiyor mu?

Evet. FiveM discord: tanımlayıcı yalnızca Discord masaüstü uygulaması çalışırsa ve oyuncunun bilgisayarında oturum açarsa gönderilir. Olmadan, tanımlayıcı eksik ve betiğiniz açık bir ileti göstermesi gerekir.

Bot token'ını nereye koyarım?

server.cfg içinde veya ayrı bir cfg dosyasında convar olarak ayarlayın, GetConvar ile okuyun. Asla paylaşılan, yüklenen veya depoda depolanan Lua dosyasına koymayın.

Her bağlantıda Discord API'sini çağırıyor muyum?

Yapabilirsiniz, ancak sonucu birkaç dakika için önbelleğe alın. Discord hız limitleri istekleri ve birçok oyuncunun yeniden bağlanması ile yeniden başlatma sınırı vurabiliyor.

Bu sorunu yaşatmayan scriptler

Tebex TemplateTebex mağazanız için kod gerektirmeyen premium tema; tamamen Tebex panelinden düzenlenir.Scripti gör →Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →

Okumaya devam edin