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
- Oyuncu bağlanır. FiveM
playerConnectingtetikler ve tanımlayıcı verir. - Deferrals ile bağlantıyı duraklatırsınız (bkz. playerConnecting ve deferrals).
- Sunucunuz Discord REST API'sine sorar: bu kullanıcı guildde mi ve hangi rolleri var?
- Onları içeri almak için
deferrals.done()veya reddetmek içindeferrals.done('reason')çağırırsınız.
Bot oluşturun
- Discord geliştirici portalını açın ve bir uygulamayı oluşturun, sonra bir Bot ekleyin.
- Bot token'ını kopyalayın. Şifre gibi davranın.
- 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.)
- Bot'u Discord sunucunuza davet edin. Yönetici hakları olması gerekmiyor, yalnızca üye olması gerekiyor.
- 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:
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:
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:
local function getDiscordId(src)
for _, id in ipairs(GetPlayerIdentifiers(src)) do
if id:sub(1, 8) == 'discord:' then
return id:sub(9)
end
end
endDiscord'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.
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 }
)
end404 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
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.DysordRetry-Afterbaşlığıyla yanıt verir. "Tekrar deneyin" iletisini gösterin ve üzerinde döngü yapmayın.
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.

