From 44bd26265eeac953cc3cb9cf5b5954c595a49329 Mon Sep 17 00:00:00 2001 From: KingMcDonalds Date: Wed, 23 Jul 2025 13:52:30 -0700 Subject: [PATCH] fixing ers --- resources/[ERS]/night_discordapi/.fxap | Bin 178 -> 178 bytes resources/[ERS]/night_discordapi/README.md | 385 ++++++++++++++++++ .../night_discordapi/{ => config}/config.lua | 20 +- .../[ERS]/night_discordapi/fxmanifest.lua | 13 +- .../[ERS]/night_discordapi/server/api.lua | Bin 0 -> 2217 bytes .../[ERS]/night_discordapi/server/cache.lua | Bin 0 -> 1612 bytes .../night_discordapi/server/functions.lua | Bin 0 -> 10644 bytes .../[ERS]/night_discordapi/server/logs.lua | Bin 0 -> 894 bytes .../night_discordapi/server/ratelimits.lua | Bin 0 -> 5736 bytes .../[ERS]/night_discordapi/server/server.lua | Bin 0 -> 3052 bytes .../[ERS]/night_discordapi/server/utils.lua | Bin 0 -> 1806 bytes resources/[ERS]/night_ers/config/config.lua | 6 +- .../[ERS]/night_shifts/config/config.lua | 2 +- 13 files changed, 406 insertions(+), 20 deletions(-) create mode 100644 resources/[ERS]/night_discordapi/README.md rename resources/[ERS]/night_discordapi/{ => config}/config.lua (62%) create mode 100644 resources/[ERS]/night_discordapi/server/api.lua create mode 100644 resources/[ERS]/night_discordapi/server/cache.lua create mode 100644 resources/[ERS]/night_discordapi/server/functions.lua create mode 100644 resources/[ERS]/night_discordapi/server/logs.lua create mode 100644 resources/[ERS]/night_discordapi/server/ratelimits.lua create mode 100644 resources/[ERS]/night_discordapi/server/server.lua create mode 100644 resources/[ERS]/night_discordapi/server/utils.lua diff --git a/resources/[ERS]/night_discordapi/.fxap b/resources/[ERS]/night_discordapi/.fxap index e6ec958fd1976773cbd4460abfd37803ee607153..55800ac693abd47153ed6b0f3a5b822c33bc5dde 100644 GIT binary patch literal 178 zcmV;j08Rf!SV2$$000000F}6c=X3XU^*HCgyzp?fL`WN3K;qPxt~wZf_CI>WYDF;N zKJkChI6Ug^Kwck@OLNI2bM9HP$tki64vi>@2rq@b6&SPGFst9U)U=qXtD4nifU0H@ zoD`4v<{l1B?`YKlweyqOn7#vKz7F%zcAgpxri#;+YXUBaP4|#7cJ#5C5t)jSkOM~$ gV}4Ec6;LDGPSwb!Be+rqI0&{Zb=o@I1kRhc`;?Sb(f|Me literal 178 zcmV;j08Rf!SV2$$000000LHg7yPM*Kw6!l|EX_Ij9kIOwum0}Mk;y<^bWVfvP3&hYOndA#tU9YqoSAl(OGhhY<4duzY zbfQuPv|aLL{A|?Go$^)PXj%l)-Oogs4cd_veM@XF3~fx={uL+x?d6um<9O?vHX9Mh gaKT7VZwJ^r<0Faxc`Y@>rkekq*Bc(!#zHqhOHHy?q5uE@ diff --git a/resources/[ERS]/night_discordapi/README.md b/resources/[ERS]/night_discordapi/README.md new file mode 100644 index 000000000..60cf8f175 --- /dev/null +++ b/resources/[ERS]/night_discordapi/README.md @@ -0,0 +1,385 @@ +# Night Discord API + +A comprehensive FiveM resource for integrating Discord functionality into your server. This resource provides easy access to Discord user data, guild membership, roles, and more through a simple API. + +## ๐Ÿ“‹ Table of Contents + +- [Features](#features) +- [Installation](#installation) +- [Configuration](#configuration) +- [Exports](#exports) +- [Usage Examples](#usage-examples) +- [Support](#support) + +## โœจ Features + +- **Discord User Management**: Check if users are members of specific Discord servers +- **Role Verification**: Verify user roles across multiple Discord servers +- **User Data Retrieval**: Get Discord user information, avatars, and member details +- **Guild Information**: Retrieve Discord server/guild information +- **Caching System**: Built-in caching for improved performance +- **Rate Limiting**: Automatic Discord API rate limit handling +- **Multi-Guild Support**: Support for multiple Discord servers +- **Custom Role Mapping**: Map Discord role IDs to custom names + +## ๐Ÿš€ Installation + +1. **Download the resource** and place it in your server's resources folder +2. **Configure the resource** by editing `config/config.lua` +3. **Add to your server.cfg somewhere ON TOP as one of the first starting resources**: + ``` + ensure night_discordapi + ``` +4. **Restart your server** + +## โš™๏ธ Configuration + +Edit `config/config.lua` to configure the resource: + +**Note**: This resource requires a Discord bot to function. You can either use the default bot provided by Nights Software (https://discord.com/oauth2/authorize?client_id=956690799385522237&permissions=1024&scope=bot) or set up your own Discord bot following the documentation. + +```lua +Config = { + -- Discord Bot Token (leave empty to use the provided default FiveM DC API bot, or add your own bot token) + Discord_Bot_Token = "", + + -- Discord Guild/Server Configuration + Discord_Guild_Names = { + ["YOUR_GUILD_ID"] = "Your Guild Name", + ["ANOTHER_GUILD_ID"] = "Another Guild Name", + }, + + -- Discord Role Mapping + Discord_Role_Names = { + ["ROLE_ID"] = "Role_Name", + ["ANOTHER_ROLE_ID"] = "Another_Role", + }, + + -- Logging Level (0 = INFO/ERROR/WARN only, 1+ = includes DEBUG) + Discord_API_Log_Level = 1, +} +``` + +### Configuration Details + +- **Discord_Bot_Token**: Your Discord bot token (optional - uses default if empty) +- **Discord_Guild_Names**: Map Discord server IDs to readable names +- **Discord_Role_Names**: Map Discord role IDs to custom role names +- **Discord_API_Log_Level**: Control logging verbosity + +## ๐Ÿ“š Exports + +### Guild Membership Functions + +#### `IsUserPartOfThisGuild(src, force, guildName)` +Check if a player is a member of a specific Discord server. + +**Parameters:** +- `src` (string): Player source ID +- `force` (boolean): Force refresh cache (required) +- `guildName` (string): Name of the Discord server (as defined in config) (required) + +**Returns:** `boolean` - true if user is a member, false if not, nil on error + +**Example:** +```lua +local isMember = exports['night_discordapi']:IsUserPartOfThisGuild(source, false, "Your Guild Name") +if isMember then + print("Player is a member of the Discord server!") +end +``` + +#### `IsUserPartOfAnyOfTheseGuilds(src, force, guildNames)` +Check if a player is a member of any of the specified Discord servers. + +**Parameters:** +- `src` (string): Player source ID +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `boolean` - true if user is a member of any server, false if not, nil on error + +**Example:** +```lua +local guildNames = {"Guild 1", "Guild 2", "Guild 3"} +local isMember = exports['night_discordapi']:IsUserPartOfAnyOfTheseGuilds(source, false, guildNames) +if isMember then + print("Player is a member of at least one Discord server!") +end +``` + +#### `IsUserPartOfAllOfTheseGuilds(src, force, guildNames)` +Check if a player is a member of all specified Discord servers. + +**Parameters:** +- `src` (string): Player source ID +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `boolean` - true if user is a member of all servers, false if not, nil on error + +**Example:** +```lua +local guildNames = {"Guild 1", "Guild 2"} +local isMember = exports['night_discordapi']:IsUserPartOfAllOfTheseGuilds(source, false, guildNames) +if isMember then + print("Player is a member of all Discord servers!") +end +``` + +### User Data Functions + +#### `GetDiscordUser(src, force)` +Get Discord user information for a player. + +**Parameters:** +- `src` (string): Player source ID +- `force` (boolean): Force refresh cache (optional) + +**Returns:** `table` - User data containing id, name, avatar, or nil on error + +**Example:** +```lua +local userData = exports['night_discordapi']:GetDiscordUser(source, false) +if userData then + print("Discord ID: " .. userData.id) + print("Username: " .. userData.name) + print("Avatar: " .. (userData.avatar or "No avatar")) +end +``` + +#### `GetDiscordMember(src, force, guildNames)` +Get Discord member information for a player in specific servers. + +**Parameters:** +- `src` (string): Player source ID +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `table` - Member data containing id, name, nick, avatar, discriminator, roles, or nil on error + +**Example:** +```lua +local memberData = exports['night_discordapi']:GetDiscordMember(source, false, {"Your Guild Name"}) +if memberData then + print("Member ID: " .. memberData.id) + print("Nickname: " .. (memberData.nick or "No nickname")) + print("Roles: " .. table.concat(memberData.roles, ", ")) +end +``` + +### Role Functions + +#### `GetDiscordMemberRoles(src, force, guildNames)` +Get all Discord roles for a player across specified servers. + +**Parameters:** +- `src` (string): Player source ID +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `table` - Array of role names, or nil on error + +**Example:** +```lua +local roles = exports['night_discordapi']:GetDiscordMemberRoles(source, false, {"Guild 1", "Guild 2"}) +if roles then + for _, role in ipairs(roles) do + print("Role: " .. role) + end +end +``` + +#### `IsMemberPartOfThisRole(src, roleName, force, guildNames)` +Check if a player has a specific Discord role. + +**Parameters:** +- `src` (string): Player source ID +- `roleName` (string): Name of the role to check +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `boolean` - true if user has the role, false if not, nil on error + +**Example:** +```lua +local hasRole = exports['night_discordapi']:IsMemberPartOfThisRole(source, "Admin", false, {"Your Guild"}) +if hasRole then + print("Player has Admin role!") +end +``` + +#### `IsMemberPartOfAnyOfTheseRoles(src, roleNames, force, guildNames)` +Check if a player has any of the specified Discord roles. + +**Parameters:** +- `src` (string): Player source ID +- `roleNames` (table): Array of role names to check +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `boolean` - true if user has any of the roles, false if not, nil on error + +**Example:** +```lua +local roleNames = {"Admin", "Moderator", "VIP"} +local hasRole = exports['night_discordapi']:IsMemberPartOfAnyOfTheseRoles(source, roleNames, false, {"Your Guild"}) +if hasRole then + print("Player has at least one of the specified roles!") +end +``` + +#### `IsMemberPartOfAllOfTheseRoles(src, roleNames, force, guildNames)` +Check if a player has all of the specified Discord roles. + +**Parameters:** +- `src` (string): Player source ID +- `roleNames` (table): Array of role names to check +- `force` (boolean): Force refresh cache (optional) +- `guildNames` (table): Array of Discord server names (optional) + +**Returns:** `boolean` - true if user has all roles, false if not, nil on error + +**Example:** +```lua +local roleNames = {"Admin", "Moderator"} +local hasAllRoles = exports['night_discordapi']:IsMemberPartOfAllOfTheseRoles(source, roleNames, false, {"Your Guild"}) +if hasAllRoles then + print("Player has all specified roles!") +end +``` + +### Guild Information Functions + +#### `GetDiscordGuild(guildName, force)` +Get information about a Discord server/guild. + +**Parameters:** +- `guildName` (string): Name of the Discord server (as defined in config) +- `force` (boolean): Force refresh cache (optional) + +**Returns:** `table` - Guild data containing id, name, icon, ownerid, roles, or nil on error + +**Example:** +```lua +local guildData = exports['night_discordapi']:GetDiscordGuild("Your Guild Name", false) +if guildData then + print("Guild ID: " .. guildData.id) + print("Guild Name: " .. guildData.name) + print("Owner ID: " .. guildData.ownerid) +end +``` + +## ๐Ÿ’ก Usage Examples + +### Basic Permission System +```lua +-- Check if player has admin role +local hasAdmin = exports['night_discordapi']:IsMemberPartOfThisRole(source, "Admin", false, {"Your Guild"}) +if hasAdmin then + -- Give admin permissions + TriggerClientEvent('chat:addMessage', source, { + color = {255, 0, 0}, + multiline = true, + args = {"System", "You have admin permissions!"} + }) +end +``` + +### Multi-Server Role Check +```lua +-- Check if player has role in any of multiple servers +local guildNames = {"Main Server", "Staff Server", "VIP Server"} +local roleNames = {"Admin", "Moderator", "VIP"} +local hasPermission = exports['night_discordapi']:IsMemberPartOfAnyOfTheseRoles(source, roleNames, false, guildNames) + +if hasPermission then + -- Example: Grant access to restricted area + TriggerClientEvent('restrictedArea:grantAccess', source) +end +``` + +### User Information Display +```lua +-- Get and display user information +local userData = exports['night_discordapi']:GetDiscordUser(source, false) +if userData then + TriggerClientEvent('chat:addMessage', -1, { + color = {0, 255, 0}, + multiline = true, + args = {"Discord", userData.name .. " joined the server!"} + }) +end +``` + +### Guild Membership Verification +```lua +-- Verify player is member of specific guild +local isMember = exports['night_discordapi']:IsUserPartOfThisGuild(source, false, "Whitelisted Guild") +if not isMember then + DropPlayer(source, "You must be a member of our Discord server to join this server.") +end +``` + +### Advanced Role System +```lua +-- Check multiple roles across multiple servers +local guildNames = {"Police Department", "Fire Department", "EMS"} +local requiredRoles = {"Officer", "Firefighter", "Paramedic"} + +local hasRequiredRole = exports['night_discordapi']:IsMemberPartOfAnyOfTheseRoles(source, requiredRoles, false, guildNames) +if hasRequiredRole then + -- Allow access to emergency services + TriggerClientEvent('emergency:grantAccess', source) +else + TriggerClientEvent('chat:addMessage', source, { + color = {255, 0, 0}, + multiline = true, + args = {"System", "You need to be verified in our Discord server to access emergency services."} + }) +end +``` + +## ๐Ÿ”ง Advanced Configuration + +### Custom Role Mapping +```lua +Discord_Role_Names = { + ["123456789012345678"] = "Admin", + ["987654321098765432"] = "Moderator", + ["555666777888999000"] = "VIP", + -- Add more role mappings as needed +} +``` + +### Multiple Guild Support +```lua +Discord_Guild_Names = { + ["123456789012345678"] = "Main Server", + ["987654321098765432"] = "Staff Server", + ["555666777888999000"] = "VIP Server", + -- Add more guilds as needed +} +``` + +## ๐Ÿ› ๏ธ Troubleshooting + +### Common Issues + +1. **Bot Token Invalid**: Ensure your Discord bot token is correct and the bot has proper permissions +2. **Guild Not Found**: Make sure the bot is invited to all configured Discord servers +3. **Role Not Found**: Verify role IDs are correct and the bot has permission to view roles +4. **Rate Limiting**: The resource handles Discord API rate limits automatically + +### Debug Mode +Enable debug logging by setting `Discord_API_Log_Level = 1` in your config to see detailed API request information. + +## ๐Ÿ“ž Support + +- **Documentation**: https://docs.nights-software.com/resources/discordAPI/ +- **Discord Support**: https://discord.nights-software.com/ +- **Installation Video**: Available on the documentation page + +## ๐Ÿ“„ License + +This resource is developed and maintained by Nights Software. \ No newline at end of file diff --git a/resources/[ERS]/night_discordapi/config.lua b/resources/[ERS]/night_discordapi/config/config.lua similarity index 62% rename from resources/[ERS]/night_discordapi/config.lua rename to resources/[ERS]/night_discordapi/config/config.lua index 1f657cfe7..f84515a76 100644 --- a/resources/[ERS]/night_discordapi/config.lua +++ b/resources/[ERS]/night_discordapi/config/config.lua @@ -5,20 +5,22 @@ ------------------------------------------------------------------------------------ -- Please read the documentation and/or watch the installation video tutorial (available on the documentation page) before asking us for support. + -- Documentation Page: https://docs.nights-software.com/resources/discordAPI/ (<- INSTALLATION GUIDE HERE) -- Support Discord: https://discord.nights-software.com/ Config = { - -- No own bot? Leave it as default and invite ours ยป https://discord.com/oauth2/authorize?client_id=956690799385522237&permissions=1024&scope=bot - -- If you do have a bot: define your BOT token below, inbetween the quotation marks: "bot_token", + -- No own bot? Leave `Discord_Bot_Token = "",` as it is and invite ours ยป https://discord.com/oauth2/authorize?client_id=956690799385522237&permissions=1024&scope=bot + -- If you do have a bot: define your BOT token below, inbetween the quotation marks: "your_bot_token_here", Discord_Bot_Token = "NzUxOTY4NTY3MzA5NzYyNjgw.GzVJ9D.kAxZs0UBN-XxcSJPBRqo6zrp1L_KsjoBHibYYE", - Discord_Guild_Names = { -- Add your Discord Servers/Guilds by their ID here, when fetching something with this resource, we try and get as much information as possible from all your guilds - ["361895986198609920"] = "Elite Groupe", -- Your primary server/guild ID (legacy scripts will get information regarding this guild) + Discord_Guild_Names = { + ["361895986198609920"] = "[Elite Gaming RP]", -- Your primary server/guild ID (legacy scripts will get information regarding this guild) + -- ["1001055923912653544"] = "My Community Discord", -- Add another guild. Make sure to invite the bot into this guild. }, - Discord_Role_Names = { -- Add Discord roles by their role ID here, name them how you want but make sure to use the same name in other configs of our resources. + Discord_Role_Names = { -- Add Discord roles by their role ID here, name them how you want but make sure to MATCH the NAMES in other configs of our resources. -- Example: ["361899298209923075"] = "EG|Owner", - ["789553875152535593"] = "EG | Development Team", + ["671141073728307228"] = "EG | Development Team", ["650653280275267591"] = "EG | Head of Staff", ["556158473981788176"] = "EG | Sr. Admin", ["635155687688634399"] = "EG | Admin", @@ -27,8 +29,6 @@ Config = { ["789551229549281331"] = "EG | Sr. Staff", ["608583076037001225"] = "EG | Staff", ["538822780662054963"] = "EG | Helper", - ["586249238623551528"] = "EG | Staff Team", - ["1231114889234219089"] = "Sheriff", ["807381510026035240"] = "Dispatcher", ["807381507622305852"] = "FiveM First Responder ๐Ÿšจ", ["807381508859887667"] = "CHP", @@ -38,7 +38,5 @@ Config = { ["876585455615889450"] = "Civilian II", ["468677647228363421"] = "Banned", }, - Discord_API_Cooldown = 2, -- Number of seconds between each API request. At least 2 is recommended. - Discord_API_Log_Level = 3, -- 0 = Disabled, 1 = Errors only, 2 = Errors and warnings, 3 = All messages. - Discord_API_Log_SameMessageCooldown = 5 -- Number of seconds between API request errors with the same message. + Discord_API_Log_Level = 0, -- Level 0 - Only shows INFO, ERROR and WARN messages | Any higher level will include DEBUG messages } diff --git a/resources/[ERS]/night_discordapi/fxmanifest.lua b/resources/[ERS]/night_discordapi/fxmanifest.lua index c6e82d62f..fd7abc6f1 100644 --- a/resources/[ERS]/night_discordapi/fxmanifest.lua +++ b/resources/[ERS]/night_discordapi/fxmanifest.lua @@ -4,12 +4,15 @@ games {'gta5'} author 'Nights Software' description 'API to fetch data from Discord' -version '2.0.6' +version '2.1.1' lua54 'yes' server_only 'yes' -server_scripts {'config.lua', 'server.lua'} +server_scripts { + 'config/config.lua', + 'server/*.lua' +} server_exports { 'IsUserPartOfThisGuild', @@ -21,9 +24,9 @@ server_exports { 'IsMemberPartOfThisRole', 'IsMemberPartOfAnyOfTheseRoles', 'IsMemberPartOfAllOfTheseRoles', - 'GetDiscordGuild' + 'GetDiscordGuild', + 'GetCacheStats' } -escrow_ignore {'config.lua'} - +escrow_ignore {'config/config.lua'} dependency '/assetpacks' \ No newline at end of file diff --git a/resources/[ERS]/night_discordapi/server/api.lua b/resources/[ERS]/night_discordapi/server/api.lua new file mode 100644 index 0000000000000000000000000000000000000000..8eb8dca2c3b5888262909a1dc79fcfcc034e7020 GIT binary patch literal 2217 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 literal 0 HcmV?d00001 diff --git a/resources/[ERS]/night_discordapi/server/cache.lua b/resources/[ERS]/night_discordapi/server/cache.lua new file mode 100644 index 0000000000000000000000000000000000000000..5eec18511167f467b4eb9bf70d6bea253109da80 GIT binary patch literal 1612 zcmV-S2DAA_SV2$$000000H7s~ud;9VJK%{Ks&Bo3Bcx+>SX75BFO~e##`mey0kV1g zk#FFB0U&fXpz##_L6iYe6%Zh_^XzDDoHxR=1qi3D;)2{bc(zz%JwF<9@<0>_CmUD4 z^cL3ax67IXcm47QsBoLWbY(`QIs;$bQqGBG6OiH}s!2gQ!|=P4FmLXmbGUicLGptuB_!(Appzci zHSwy2DPMIJA~?`In(@n3`vU3xX&hz`?Pn6y>k8fDcO-aK5DE-yEW?|6qVI}7@UITiE*}r0B2We^c3p*V5Tlr%e%%)` z)5_`u{3Zf5sY!~&&A%Y6-@7u-kUK=^LpF&aIm84ILRtyF--Zab z9U~kFot?_yH=c_!btx$F3C5sPMD@s4^L;Ii0c8^QMzTpl*ty6?Vlm2$KySL%Vw| z&0?8TA^lu9b6WWkqAh#99%iL*_JaelX)6^h=r6-5rQLvtZE-mTmSc08UxMg~rPNSp zj-UksMXo5Sg^Sno0$KxIFrP+6t_FD9nkWxFGr4!b@eLC#Aw+S&Tmd!4skG{>y1yUh zW5XK%G6ytsbt86B+{4YZX4nRsX%cKhntLxX!WY#)=!6|KBaQ3!0{x~T{bAtkk?qG} zU4Y+BUf`seS`h#(zXPNzrGO7t;9_lc`tpPpC}D^~d-PgOHfV1aajWgQ9Wz zILgT4=*v?mghk0b#(Eo6T=J&|H>ab{V_9be?EDVm|Ii~KpHWK2&O4Q}@6gJ=P))_g zq<1H5B?UbdKp^EAhN{EU=o)%hlhW3b2#gbxHQx*A6d6q;aX<#1#JYbRWHDqI{Ot0E zK5zkfre+OnCy};7(R4@JU8H`-mcP&Kr%nVm`Rv1|jmibLhj)k(SN2o9geDG+#5I56 zEEeFw(+U)AJcOr=z}CSOdEII#@|94YG`ej0l~geB4?(*+9^=nx&fxt3<5xX{4A_3y zx4&O8SvI|aAs;Ts;kNvX4HP-1SlfGzU9sep|H+bJbuMjKCQ&99#d4U|8t#JQAw~Hy zd0F1-Sb?Uny%LlPEy0}9f70@C)?V;4MigNE<3!CF<^nR5L6~&efmDZB%6!{MN1Xe- zzs_C_ta!oA=7$N2IA5Tu@WiWrLHXc&DspA^;1yfnPBp0cfV>w zi)}En0yYlXJdfcGj0E6K+u2;T!{YOC$r@Hx9Ku+g^?a(d1#RX(_50V!(W{Io;rV4!=RAx z)Y2MRzu`#;)fzo_r+yl6k<02pHH3EWx{GNC*}PR^1X%fQbbaGYL3$iWIo}Y z>;?QS>;5jKRuj}kz$a~@x_zNmD0kr1gwxiqsKYU8@{>1Tw<@sXLjNN;HE^f^<89zI z{g`&ipN!Q2Ssz0SIb={9LKiRs?9(vItDwc;IW7Gl8z0CJps^8<*;|PkI(aC4h!;F& zseBm7znh;O`!*)CZ|c*Xb#QX`51LNVVR;22N1S;hf1(^56qt^z2dvwLwLvdq9AN7z K)cf-=#M&gk$r11X literal 0 HcmV?d00001 diff --git a/resources/[ERS]/night_discordapi/server/functions.lua b/resources/[ERS]/night_discordapi/server/functions.lua new file mode 100644 index 0000000000000000000000000000000000000000..d1d2182aad654cd8519651c781ad4ade0bee1fe5 GIT binary patch literal 10644 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 literal 0 HcmV?d00001 diff --git a/resources/[ERS]/night_discordapi/server/logs.lua b/resources/[ERS]/night_discordapi/server/logs.lua new file mode 100644 index 0000000000000000000000000000000000000000..5ca042681009d702e054580ca3d15afa8b56dee7 GIT binary patch literal 894 zcmV-^1A+WTSV2$$000000N}mjY`H?MZK~w={X8e3XM$dz3W+wC+stv0Qof~FVpg(7 zO0c1}hduYa*lOU@ANrlKa5RI_jX$uYF4_}~2vzz(jD_D{28RY-d}%gnRh7J=URD;e z`^^1*8Es~Mz~Ra!yDfl{;G}g4!A|9jE!}sk>8#5aUb<9q@Ja&8)ZJh zE0I$@vXJs?==3RL?~Ux4;OC^Tw_@%w zcK&NZtb4jK&l!~}`6()Gc}-|x6K-w^6@@SR-%ls_@=@x)3)m*;c+BT3sGy}KE4kV$ z;wlK$&hF6xbOp!|jiNbWJS-|gI^LebMOR=77@MihzWtS!(Kg8g;bT&zOjlHd(w4U) zICGGA%i^VMHj-vou`fq`LyV#gU%3JMhkgNkP}qG+U4t-2=L>5L^Y3Evr^?C6=c>Bd z6DcyVbduvo zR(@W(!=qEE(>i9_8s=TUA1)Cd8SW0g&sc?B%9!_RKOjY1^{uUl5mKGgP|E? zM6Y4lP9XF+;*PKBCv{a5$f-_@4JJl1(u(!lkkFeRQ6-B(Y0$j z_T%&Op7r6aDcBuIza|P>8<|;YtyQhQ0|oy~@Hfg` z?0$?|9jn)iS8ks|lOdcn>$*IGGr<8z3f&YKnVud5$YNlmBTedy!QYmZ|7lR4f1@y8 z7Y6qCpL6ywB4usN2Y%PUPOmpgFz$Ltyh;i>2hr6atAi>uEt_*1XdeDAW%0UQ?w*|vD`ZpP%?5Nm|v>aaTZ5HX3U1(0Wqbs*vZ04av}J$UHZY6n0J1Ok1=dketIcNj+aOqjF67EZ=|kGJ{QlZouy-~+W-In literal 0 HcmV?d00001 diff --git a/resources/[ERS]/night_discordapi/server/ratelimits.lua b/resources/[ERS]/night_discordapi/server/ratelimits.lua new file mode 100644 index 0000000000000000000000000000000000000000..441f73610af09daa4c46b4056f0102c7275f7896 GIT binary patch literal 5736 zcmV-u7MJNpSV2$$000000EZ%Yj1EtfkpYP|lzuVbP|=dNl=ENscm^1&TrT$4z){|P z3j>H}u0UWVpAz;4i|a9-(2&|p#o|3jbK8^Y3%e)H<iifDTeG+kZn z$tA)MKr=J|<{;RJM4~Ig-J3;=y0CpA&6NXP^>%eKYuZ<@rYiL-=1SLp8YK#2Okg%= zJL2a~6T{CDWo&H$6uW4D*x09{gLukuQ=fC*VK%l5rcKURL~5I@+vVE}Vx0*1pdz24 z#WWx1%t3@Z*!_jH-wzRz5l9Kg5t7r0d&{H5i(UTA)0qyYS8!bXho2HX;1fvKk+cFn zEh#d#%9~@v_%g}LMfy%#>e=u34hyvbQM*2{<#-)e$btE^>3Yd;W|~#^DX_qG6xld- z+U^lj*{n#*%ZoIp7$%6qMN6`*oX3)OGJB(+Jdp`Vr~*kKJw6dGly+#biGc4bi5#41 zu%udDENUr%+juY+K;1W9RwWKTb0lbe=#{IA-p+ic$H@##lm<)9AF;%_W;L_tMgz9w z9TW2gQ~FQv?^K=wRk?JY9Hq`en8KiLQL))vT$0Y*8*T1U4Qv5wA}W8XqQ*RHvWX)U zI=tnMaFNm=di5w(FkQSo7OGotQjN$0znK!5>`?su$agVipMr-^m~>>w54or7R}Q6v z8f^*uADe7I!$(l;zCI+B*~yLIbQiLnMFsB1D?kzw1P)p5(v&HFV(Q$1dZvGuN3S1F4?)5}^`7R93mC;lJ zR7`5GiJKIe@x)t^F+;uH3SscFwa5|p&%Nn=!TBRfw@g8eoYTC8lZO9pB5i z`ZzXBcqAFfu2VR#nn~3Rn6@tKLA{*hg1pJBdM+~DA%$y08(>d08$={+r)u985>Bo& zmN`bJU&#IX`Z^q0NBP$cLWelyZg8vyTnqph04ULUd(^21O-WHPcebOi5}b72z9fy8 z8JNci7+F|c-bHFWbuKSrMF*kJAjL7EEB<(LoM5mypZKNtq_~KZk}%=V28X%gPRCsb zZ$H%73uoIg-^0bc)-ht*KhtlLqY(0c_km%LaJ$IPuJQH~KfoH|RmLP=&%6);5M$q) zL&q1I7zjJ~*3QqC&r zYvjo#a9oB*ZmM*6WHCvxVZw{6Bm;plX!?)EM#>`>Ji5{rT*EF? zkuevDIZs4Z*Oj1kk^FGIGxI9R460mnI_XlQSLb9ExtWR_e?_(HSCztr27M+A+20)+ zObX98vUD=Eiu&Qjw`ujC;+w#eCDuqt7+{&a-;Xu2TR}^qKlqG^x@u0N!BXixn;Hw# zT9&EE*7c<>5U-wkGf_Y@gQdYdO+o=R%fn?(h%?n?0NP#>G?a7T)XVzE!LGeN)RAsr zjcbW*&Nz%v@(_Oyv2LsM>4nXUvUz$W8WxA%Y~E|EUPp2(E3=K>AK3r!C-&`0y6lIcs>hXFeeG6Q(>W^a#o~NbTcO3}jO{qC&XDd# z-bKr^Gk-G=oGs1xc~vTV?ewM_c4>(86TsDxGw7!|_32XscM&>tmR zlUh!0-x;K)b8cT*HdZ<0k>{`Wr5VgKO*8TCLVb#%$t1V& z>d9;q^ESWxtTfgV2boJompMuJ_Jd4QJ|;1Eq-PK%W_(c2z`J$|sJEV!QY) z@@|L~74UhQ|@fc@GG5`@9?Gs(31IG9UI3LdoG8Jpd1+z$!(hYK)Dhk9H3ZhDG~$`OQ3 zh&Co5trTHdIrK7!>E_YV1n~Vlo^$?v&m0JRqJG;A#`9IfpDiQqMxLrwtMFeO70dY*LWi4#sq#DR8@uuka zcxpoHJSQykkdmNLHsKR;SrsoLfsD4*4W;Z^+#Bm_OiF}@lFhLU=T;Tn2AU!r& zP(=Q;v1%?!EC^G($QXmTBb>GMMUe>r_`Z3gu$hcjiVJD(a( zSwuCGA1k*3zzztgYNy6^#SdRm*2uD9tUF+4M&sYjnY7kc0_Ih3c`tHl!u^Sc;Z%4J zRO4*qDHRu94cRi?(aIg9B%eYNA#OY}LUNXittZiX zwT`RoGLV4yW0ZAL*8IF9;1-nXoXSO~d1Q?AnY$-`xXCE30B5CfZ2%e*)jAgQS#6o? zNu2|g#sK%k-2~~U(^2d9Ug@I@kTiew2qBN5SROb$PZW`5itE4rj=Pd3 z9+Z`kzMhv!(>APCnt?>#U6JCDbQzBCs<)E6%bqY4%P=&#>Q5ks3m?R9L3xuKPO=P$ zXAQ*JJ5Bz}t*T30_RYa(?1I%KJb4aYaCyu(PHH|O!pzwreb@faWBWFI9`>UBM-#m& zp1NQIFo2edavafCoPK^f%*P{zd|<|GzCL8^mD_nY_G^XfY|7p22pSK95erMGJm&l1 zCwg)tzS4L_pKS-OsbDXfxoru#@rs9b-IB0gaW0KqA0H(kuJzIz+8^20)^CY*8Xw|Q zOFMBoc=x6wDs$n_h>pb??-H+ta=GT?K;C#n)?f6t|9X%Iy79`|~<9v)iSn$PdML^CMp!D$6?ZU*;&VJfB$qCoz&7bv; z*1VW4Tyo{aoHLrz{cLvx>UG@3n;4@7CWrx=CYy%g(SKbpEXBqxOQJPuws=nAl-Q>> zhllg|`2uX9TQCF%EI?mTWX!T)UNY6fsil~~Llq5k;p|d-Ax-dZV3gNeJ?Hcg>YG{c z!Fcp^@`>V74#8fKC!s8W?oGl<1;ISRSg#$0G62sZ5LdgyA^BN!S;w%j2*u>aB->0;EbVR!9k^3le0l}J~- z0@vd;IQ3xs0i23lxG56;H)P27-GO*r1+HWAc1xGRW(M=fnpfcOZ zMZfT!4%ty^COdv#1ZdW#)?+AbFwDy*&lE+OZGl+p(bR$&m(#uZ^bdIXHce++8*jY} zw~Gt8lJGL7wrS>hsJZpKx_21|L$@`|ZOB0|gAum~a7H~3w;lq8PXC|JKNJ)uwyUqa z;QrqclRhMQKS^_V5rMDG2}qVyPN(zA@q^X-19T`oyl+`B!cBpjW8S{8Qv`yp8r6kj z>rVGGk_C0h#1y!UzuWG9cqs-%e6O<$w_H@GHxG!Km+3pfQ}vofc2J}*#CDG_91@xl z0G2%Z^1WP>rTK94hO2&2X@kv6R-bzQI7NHLIHE@d3Byk$e$(EgYJ}}g-F==djo8>+ zN`k*^^Pp+wJSk8QH24?rMLBJ4-Cn70Q^fki0(`3|MdraS0Lz{HTJ)aBVZICF>fOKG zu#2bN`9Z1xhGW)11r%pl6KBB_S;%;as+rv**e|}Jv)MEuQLKk*_Da$ituhevi(xGV zpLw#_BZ@}(E%db2?lq{WvT_?>)j95^VnhS-j-j)qBE+NyRtS#lQ*D2}7JDs<-*d6IS$4l8@$#ii>NSi7D!3PUmG!p7T@ zu^;1be3}NSa)XYohQ_^TCWn)uxg8rhz|rDdpO-LX^p|I|0wY$vf`pB^*Ebm=y!$~= z!4MnTI$xpyt8jnE@jVu&?7V)JDD@8xtX8Z4#t|L#`0G%sNS3pX59!fw%`L7yDNW;F z$m3H!1#=XXue>KdC0ceD3i+vyCsb55EwY+XU{>e@C$oP;VATJh){+L<%|e!1U#jmOW+#Cq+DrjCL`g_1URY={@MJLyU_vPP)@r*tSi%v7vLkS%fBO!L6xAqKwv5AELW-~{sq?JKv)+$Ujlt&4=iAXS@B43k<`v&RZhI`MFRJI+)h}+s(j?wi@0<<3-ZWw55?+zp{VBy%N8Hzv%)hQF}S}z z5BniK+vr@I)xr#NRZd|~U_ zDNRcTogv;HT=dyMn3)+X-lb#Qjze0!3*qB|01$~x|bpm1ch5_f)`p5!u~u!7AVZOu$iw!fl{CR)Gb|WG4N*w8ty6J z$*7t7%|e2Yf(CZ}NXq8JiW@&((#g)$sZrxm0=~$ zFRME4153xbHQI~WO$n$8&p}MC4S)(BNW09N0TlDZua}+XC6(9peRohCaXT$*UvJT$ z2>cz`q7rTxoqZypcILIZ!Rgkz)!qS^`D{3}V?nX_+~}L(_SMIZI^_qES!NW4--0IK z0Gfqknu-)Il4)v>u%IKM;2ly=s{@N|x+?B$rbKKZs0 z=SlRwFInT}2&$IN8Vb{VR6qs~F}B|i!VBCI%&g~JpP_O$gKo{ymW|dUE0{*ND)Hi) z)D3*1f>g$;j`QlqG$iw%4^(%7BzY04;2mUO+06CyPal}f`J38#gM9qtDbR~_r^bq9 zBPHx9v8WO9cykF8n`zBy$*GhbrQUxX!*FcccU4?f4%%5vRJX+U*oItAif>ha$0=nM z^f6&aztvwSdaO>FmU8@~xYY!A-t*sU7-~H+Wz&m!nu3p94jwE`$KBYYFz_(n_Pd6) z6KWne?}YN0VOMaHAte+#c~Mhp`M=`G8Al2;hAEg$4EnfFSK4+* zMqn)VXo9@g2~>O*hSd$Y_J()MsQ{@?cl0*e@fjR4gs>4I@VsDnh-aLsJSv&=ZB1yF zs-oI1y1CNS0T9EfmX@<)M36EQL6^$HcVW*uIj{m)Qx-YXSGr+aub{nSfia#rhiyHqn|37{?bmpxdYN3fqxO&kuerl-}7#_Fr~ z^cAf4O@ErzNX6NAG>q-rpOVhXK zZ3x&&Yd~+O>BlJ2H=ifBllt*{hdoNi*3hQC*xZi&L2lU>x;BiyaM|b}b!jb`pfNRs zwU6AhI+K#5wLBVzdOB|`du23yV(^f0N0Lc~`-0zk=4PO(S+eIAW-+;K!G)p7&z3m? z0T)A3o*%~AqU?OnUzNCksS1gh%cTb!Tlad&F%w+R(4;JE7R z!VqSfit7r;9fbgUrF+q??=0LrJoDsUxRsyjk$j)Oc*$o%knGs$S}XvR%U+Nsw(u2_ zuFwrm0i!)2*Jk-X#Ewv$WgQ?WhCZwE(rQeNJ literal 0 HcmV?d00001 diff --git a/resources/[ERS]/night_discordapi/server/server.lua b/resources/[ERS]/night_discordapi/server/server.lua new file mode 100644 index 0000000000000000000000000000000000000000..f72b09c3e3763caf059548c35c92e4b74ae53252 GIT binary patch literal 3052 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 w1dA7l&>dR1XU|8