# ---------------------------------------------------------------------------- # # | # | # D e n i z e n S Q L A P I | # | # An API for scripters to easily implement SQL | # | # *REQUIRES MYSQL* | # | # | # Author: |Anthony| | # Version: 0.1.3 | # dScript Version: 0.9.6-dev-199 | # | # Dependencies: | # - SQLManager: http://mcmonkey.org/denizen/repo/entry/19 | # - ConfigFileGenerator: http://mcmonkey.org/denizen/repo/entry/7 | # | # ---------------------------------------------------------------------------- # # # # ABOUT: # # SQLAPI is a library or API for Denizen scripters to easily implement SQL # in their scripts. It is intended to supplement the denizen flag system for # those who require data to be shared across a network of servers since # Denizen currently has no cross server flag capability. # # The SQL backend functions are almost /completely/ handled by SQLManager. # Automatically goes into offline caching mode if the sql database goes # offline! # # #------------------------------------------------ # # USAGE: # # -- Setup # # 1. Create an empty SQL database on your server. You can name it anything you # like. The default name is SQLAPI. # Consult your operating system manual or other online documentation for # instructions how to install and setup an sql server if needed. That is # beyond the scope of this documentation. # # 2. Install SQLManager.dscript following the instructions provided. SQLAPI # Will not load if SQLManager is not installed! # # 3. Install sqlapi.dscript to you Denizen scripts folder and type: # /denizen reload scripts # # 4. From console or in game (with sqlapi.admin permission) type: # /sqlapi --restart # This will extract the config file to /Denizen/SQLAPI/config.yml # SQLAPI will begin the connection attempt process, but will fail until # you edit the config.yml file with valid connection information. # # 5. Edit the config.yml file with valid connection information for your SQL # database created in step 1. If you have edit config.yml before the # connection attempt cycle expires, SQLAPI will proceed with setup, if not # you will need to repeat step 4. # # 6. SQLAPI is now installed! Rejoice! # # # -- Permissions # # Admin permission: sqlapi.admin # # #------------------------------------------------ # # API Guidelines and Explanation # # -- Notes # # - SQLAPI utilizes the events system for setting/editing/deleting sql flags. # - Learn more about the events command: http://mcmonkey.org/denizen/cmds/event # # - The events command in Denizen lacks the ability to handle lists directly # in the context section. You MUST use the .escaped tag when supplying a # list value! # # -- Setting/Editing/Deleting Flags # # Working with SQL flags is easy! You must specify the type, flagName, # and flagValue context fields when you do. The duration field is optional. The # owner field is not used for the server type flags. # # Full Example: # - event 'sqlflag set' 'context:owner||flagName|myFlag|flagValue|potato|duration|5s' # # # -- Context Fields # # ~ Type # # There are four (4) flag types available through SQLAPI. # - Type Values # - server - Global flags with no owner # - player - Player specific flags # - npc - NPC specific flags # - entity - Entity specific flags (not fully implemented) # # Example: # 'context:type|player' # # # ~ Owner # # The owner field is required for player, npc, and entity flag types, but is # NOT required for server type flags. The owner field must contain a valid # entity object for that particular flag type. A player type flag must have # a object in the owner field. An NPC flag must have an object # in the owner field. An entity flag must have an object in the owner # field. # # Example: # 'context:owner|' # # # ~ FlagName # # The flagName field is where you declare the name of your flag. Flag names # MUST be unique. Setting a flag value on an existing flag will overwrite it. # Players, NPCs, and entities all have their own flag associations, which # means that player A and player B can both have a flag named 'potato' with no # conflicts. # # Flag names are limited to roughly 21,844 UTF-8 characters. You should have # plenty of room for exotic flag names. # # Example: # 'context:flagName|potato' # # # ~ FlagValue # # The flagValue field is where you store the value of your flag. It can hold # any string, integer, decimal, boolean, or list value you like. It has a # theoretical limit of 5,592,404 UTF-8 characters. # # When working with a list flagValue, you must escape the whole list. This is # required to overcome a limitation with the events command. Your data will be # stored and returned to you correctly. You may also choose to use your own # delimiter. You will be responsible for recreating your lists when you # retrieve the value. # Example: # - define list 'li@a|b|c' # - event 'sqlflag set' 'context:type|server|flagName|myFlag|flagValue|' # # # ~ Duration # # The duration field is an optional field for all flags. Setting a duration # on a flag will make the flag available for specific amount of time. The # value for the duration field can be provided in any of the following # formats: T=ticks, M=minutes, S=seconds, H=hours, D=days, W = Weeks. # Not using a unit will imply seconds. # Example: # - event 'sqlflag set' 'context:duration|10s' # #------------------------------------------------ # # C h a n g e l o g # # - v0.1.3 - 4/29/15 # - Implement the event system # - Scripts are encouraged to use the event system and NOT the command system # - Break up the sqlflag command into its constituent parts # - Results in a flagString parser # - Add fancy linewrapp and formatted message system # - Run almost all messages through the message system # # - v0.1.2 - 4/28/15 # - List index manipulations # - Insert: Inserts additional values starting at the specified index # - Set: Inserts additional values replacing the specified index # - Added # - Returns a Duration of the time remaining on the flag # - Returns d@0t if the flag does not expire # - Does not return if the flag is expired or is not set # - Owner can be server, or any valid , , or object # - Added # - List all unexpired flags for # - Owner can be server, or any valid , , or object # - Added # - List all owners of the specified type that have the specified flag set. # - Valid types are player, npc, and entity # - Added # - List all owners of the specified type that have the specified flag set. # - Valid types are player, npc, and entity # - Will only return owner objects for those (players) that are online or # (npcs or entities) that are spawned. # # # - v0.1.1 - 4/27/15 # - Correctly distinguish between existent and expired flags when editing lists # - Math functions. Can now increment, decrement, multiply, and divide flags # # - v0.1.1 - 4/26/15 # - Make handle lists natively # - Set list function works, may be expanded/revised at a later date # - Added Include and Remove list functions # # - v0.1.1 - 4/25/15 # - Don't store escaped values in the db # # - v0.1.1 - 4/21/15 # - Added # - Returns the flag value # - Does not return if the flag doesn't exist or is expired. # # - v0.1.1 - 4/20/15 # - Added # - Specify an owner object and it returns the type. # - Return values are player, entity, npc, server, and thisPlayer. # - Does not return on invalid input. Notify console instead # - 'thisPlayer' is a literal string and should be handled in the calling # script. It's intended for the sqlflag command so the literal string # 'player' can be used to denote the person issuing the command. # - Simplified the context required for GetFlagRecord, FlagExists, IsExpired, # and HasFlag procedure scripts. Now only require the owner and flag context # Eg.: # # - v0.1.1 - 4/20/15 # - sqlflag command # - Allows setting/editing/deleting flags in game with a command # - Currently only the set flag code is written. Don't try to do any list # flags or removing flags yet! # - Added # - Returns a raw flag record li@flagName|flagValue|expiriation # - Returns "SQLAPI OFFLINE" if the db is offline # - Really only meant for internal usage. There will be more user friendly # options available in the future. # - Added # - Boolean tag to check if a flag exists # - Does not return if the db is offline # - Really only meant for internal usage. # - Added # - Boolean tag to check if a flag exists # - Does not return if the flag does not exist OR the db is offline. # - Really only meant for internal usage. # - Added # - Boolean tag to check if a object has a flag. # - Returns true if the flag exists and is not expired. # - Returns false if the flag does not exist or is expired. # - Does not return if the db is offline. # # - v0.1 - 4/13/15 # - Initial commit # # #------------------------------------------------ # # TODO - Future Feature Fluff # # #______________________________________________________________________________# SQLAPI: type: world speed: 0 debug: false action_map: set_list: '&pipe' include: '->' remove: '<-' increment: '++|+' decrement: '--|-' multiply: '**|*' divide: '&fs&fs|&fs' clear: '&exc' events: on server start: - run locally start delay:1t on sqlflag set: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally set_flag on sqlflag set_index: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define index '' - define flagValue '' - define expiration ']||0>' - inject locally set_index_flag on sqlflag clear: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - inject locally clear_flag on sqlflag include: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally include_flag on sqlflag insert_index: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define index '' - define flagValue '' - define expiration ']||0>' - inject locally insert_index_flag on sqlflag remove: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally remove_flag on sqlflag increment: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally increment_flag on sqlflag decrement: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally decrement_flag on sqlflag multiply: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally multiply_flag on sqlflag divide: - define owner '' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } - if %type% != server { - define owner '' } - define flagName '' - if %flagName% == null || == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flagName!' - queue clear } - define flagValue '' - define expiration ']||0>' - inject locally divide_flag on sqlapi command: - if ! && ! && ! { - queue clear } - determine passively FULFILLED - define arg1 '' - if { - run s@SQLAPI_Msg delay:1t 'def:<&d>Restarting System!' - define isRelaod '' - inject locally start } on sqlflag command: - define time '' - if ! && ! && ! { - queue clear } - determine passively FULFILLED - if < 2 { - run s@SQLAPI_Msg delay:1t 'def:<&c>/sqlflag <<>owner<>> flagName(<&lb>#<&rb>)(<&co>action)(<&co>value) (duration<&co>duration)' - queue clear } - define owner '>' - define type '' - if %type% == null { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify valid flag holder!' - queue clear } else if %type% == thisPlayer { - if { - announce to_console "<&b>SQLAPI<&co><&c> Must specify valid player object from console!" - queue clear } - define type 'player' - define owner '' } else if %type% != server { - define owner '' } - define flagString '' - inject locally parse_FlagString - define duration '' - if ]> || ]> { - define expiration '].get[2].as_duration||null>' - if %expiration% == null { - announce to_console '<&b>SQLAPI<&co><&c> ].get[2]||null> is not a valid duration!' - define expiration '0' } else { - define expiration ']>' } } else { - define expiration '0' } # - announce "Narrate values" # - narrate "<&2>===" # - narrate "size %size%" # - narrate "owner %owner% %type% " # - narrate "flag %flagName%" # - narrate "action %action%" # - narrate "flagvalue %flagvalue%" # - narrate "expiration %expiration%" - inject locally %action%_flag - inject locally msg_%action% - narrate "Time taken<&co> ms" - queue clear parseAction: - define actions '' - foreach %actions% { - define map '' - if { - define action '' - foreach stop } } - if %actions% !contains %action% { - define action 'set' } parse_FlagString: - define preparse '' - define size '' - define flagName '' - if %flagName% contains <&lb> { - define index '].replace[<&rb>]>' - define flagName ']>' - if == 0 || %index% !matches number { - define index:! } } - if %size% > 2 { - define size 'extra' } - inject locally parse_flagString_%size% parse_flagString_1: - define flagValue 'true' - define action 'set' parse_flagString_2: - define action '' - inject locally parseAction - if contains %action% { - if %action% == set { - define flagValue '' - if { - define action 'set_index' } } else if %action% != clear { - narrate "set value to 1" - define flagValue '1' } } else { - run s@SQLAPI_Msg delay:1t 'def:<&c>Must specify a flag value for %action% flag action!' - queue clear } parse_flagString_Extra: - define flagValue '<&co>].sql_escaped||null>' - define action '' - inject locally parseAction - if { - if li@set|set_list contains %action% { - define action 'set_index' } else if %action% == include { - define action 'insert_index' } } - if %action% == set { - define flagValue '<&co>].sql_escaped||null>' } else if contains %action% { - if %flagValue% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>%flagValue% is not a valid number!' - queue clear } } start: - ^define yamlName 'SQLAPI' - ^define scriptName '' - ^inject locally reloadYaml instantly - ^inject locally loadData instantly - ^if %useSql% { - announce "<&b>SQLAPI<&co><&c> Must be configured to use MySQL!" to_console - inject locally unload - queue stop } # Verify SQLManager is installed and ready - ^if ! { - announce "<&b>SQLAPI<&co><&c> SQLManager not installed!" to_console - inject locally unload - queue stop } - ^repeat %retry% { - if ! { - announce "<&b>SQLAPI<&co><&c> Could not connect to SQLManager!" to_console - if %loop_index% == %retry% { - inject locally unload - queue stop } - announce "<&b>SQLAPI<&co><&c> Will attempt again in %retryDelay%..." to_console - wait %retryDelay% } } # This checks the status as set by SQLManager to not duplicate restart # processes. This is the only time this script needs to set the status. # The SQLManager will handle every other situation. - ^define status '' - ^if { - announce "<&b>SQLManager<&co><&c> Already attempting to reconnect to %db% database!" to_console - queue stop } else { - yaml set 'id:SQLManager_Offline' 'Offline_Cache.databases.%db%.status:connecting' - yaml 'savefile:SQLManager/cache.yml' 'id:SQLManager_Offline' } - ^if { - run s@SQLManager p:restart delay:1t def:%yamlName%|%scriptName%|%db% - queue clear } - ^inject s@SQLManager - ^announce "<&b>SQLAPI<&co><&a> System loaded!" to_console - queue stop reloadYaml: # Reloads the yaml files and generates default files if they don't exist. - announce "<&b>SQLAPI<&co><&3> Loading system config files..." to_console - if ! { - if != null { - flag ConfigFileGeneratorNotify:true - run s@ConfigFileGeneratorHelper def:SQLAPI|Configurations|false|false|false instantly - flag ConfigFileGeneratorNotify:! } else { - run s@ConfigFileGeneratorHelper def:SQLAPI|Configurations instantly } } - if yaml unload 'id:SQLAPI_config' - yaml 'load:SQLAPI/config.yml' 'id:SQLAPI_config' - inject s@SQLAPI_SQLTables - announce "<&b>SQLAPI<&co><&a> System config files Loaded!" to_console loadData: - ^define yamlName 'SQLAPI' - ^define scriptName '' - ^define useSql '' - ^define retry '' - ^define retryDelay '' - ^define db '' - ^define PlayerSQLFLagsTable '' - ^define NPCSQLFLagsTable '' - ^define EntitySQLFLagsTable '' - ^define ServerSQLFLagsTable '' unload: - ^if { - announce "<&b>SQLAPI<&co><&3> Unloading config.yml file..." to_console - yaml unload 'id:SQLAPI_config' } - ^if { - announce "<&b>SQLAPI<&co><&3> Unloading SQLAPI_SQLTables file..." to_console - yaml unload 'id:SQLAPI_SQLTables' } - ^announce "<&b>SQLAPI<&co><&c> System disabled..." to_console clear_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define flagExists '' - if %flagExists% == offline { - announce to_console "<&b>SQLAPI<&co><&c> System Offline! Can not remove %flagName% for %owner%!" - queue clear } - if !%flagExists% { - run s@SQLAPI_Msg delay:1t 'def:<&c>%owner% does not set %flagName%!' - queue clear } - if %type% == server { - define statement "DELETE FROM %tableName% WHERE flag='%flagName%';" } else { - define uuid ']:||>' - define statement "DELETE FROM %tableName% WHERE flag='%flagName%' AND uuid='%uuid%';" } # - sql id:%db% "update:" save:id - inject s@SQLManager_Offline p:managedUpdateStatement set_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define flagExists '' - if %flagExists% == offline { - announce to_console "<&b>SQLAPI<&co><&c> System Offline! Can not set %flagName% for %owner% to %flagValue% in %tableName%!" - queue clear } - if %type% == server { - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement set_index_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - announce to_console "<&b>SQLAPI<&co><&c> System Offline! Can not set index %index% %flagName% for %owner% to %flagValue% in %tableName%!" - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% && !%isExpired% { - define flagVal '' - if { - define flagVal '' - define flagValue '<&pipe>].set[%flagValue%].at[%index%].replace[li@]>' } else { - define flagValue '<&pipe>%flagValue%' } } else { - define flagValue '<&pipe>%flagValue%' } - if %type% == server { - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement set_list_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not set %flagName% for %owner% to %flagValue% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% && !%isExpired% { - define flagVal '' - if { - define flagVal '' - define flagValue '<&pipe>].replace[li@]><&pipe>%flagValue%' } else { - define flagValue '<&pipe>%flagValue%' } } else { - define flagValue '<&pipe>%flagValue%' } - if %type% == server { - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement include_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not include %flagValue% in %flagName% for %owner% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% && !%isExpired% { - define flagVal '' - if { - define flagVal '' - define flagValue '<&pipe>].replace[li@]><&pipe>%flagValue%' } else { - define flagValue '<&pipe>%flagValue%' } } else { - define flagValue '<&pipe>%flagValue%' } - if %type% == server { - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement insert_index_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not insert %flagValue% at index %index% for %flagName% for %owner% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% && !%isExpired% { - define flagVal '' - if { - define flagVal '' - define flagValue '<&pipe>].insert[%flagValue%].at[%index%].replace[li@]>' } else { - define flagValue '<&pipe>%flagValue%' } } else { - define flagValue '<&pipe>%flagValue%' } - if %type% == server { - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement remove_flag: - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not remove %flagValue% from %flagName% for %owner% in %tableName%!' - queue clear } - if %record% != null { - define expires '' - if %expires% == 0 || %expires% > { - define flagExists 'true' } else { - define flagExists 'false' } } else { - define flagExists 'false' } - if !%flagExists% { - run s@SQLAPI_Msg delay:1t 'def:<&c>%owner% does not set %flagName%!' - queue clear } - define flagVal '' - if { - define flagValue '<&pipe>].exclude[%flagValue%].replace[li@]>' } else { - run s@SQLAPI_Msg delay:1t 'def:<&c>%flagName% does not contain any %flagValue% for %owner%!' - queue clear } - if ]> { - define delete 'true' } else { - define delete 'false' } - if %type% == server { - if %delete% { - define statement "DELETE FROM %tableName% WHERE flag='%flagName%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } } else { - define uuid ']:||>' - if %delete% { - define statement "DELETE FROM %tableName% WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } } - inject s@SQLManager_Offline p:managedUpdateStatement increment_flag: - if %flagValue% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>%flagValue% is not a valid number! Not incrementing %flagName% for %owner%!' - queue clear } - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not increment %flagName% for %owner% by %flagValue% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% { - define flagVal '' - if %flagVal% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>Not incrementing %flagName% for %owner%! Current value %flagVal% is not numeric!' - queue clear } } - if %type% == server { - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value + '%flagValue%' WHERE flag='%flagName%';" } } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value + '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement decrement_flag: - if %flagValue% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>%flagValue% is not a valid number! Not decrementing %flagName% for %owner%!' - queue clear } - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not decrement %flagName% for %owner% by %flagValue% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% { - define flagVal '' - if %flagVal% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>Not decrementing %flagName% for %owner%! Current value %flagVal% is not numeric!' - queue clear } } - if %type% == server { - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value - '%flagValue%' WHERE flag='%flagName%';" } } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value - '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement multiply_flag: - if %flagValue% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>%flagValue% is not a valid number! Not multiplying %flagName% for %owner%!' - queue clear } - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not multiply %flagName% for %owner% by %flagValue% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% { - define flagVal '' - if %flagVal% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>Not multiplying %flagName% for %owner%! Current value %flagVal% is not numeric!' - queue clear } } - if %type% == server { - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value * '%flagValue%' WHERE flag='%flagName%';" } } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value * '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement divide_flag: - if %flagValue% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>%flagValue% is not a valid number! Not dividing %flagName% for %owner%!' - queue clear } - if %flagValue% == 0 { - run s@SQLAPI_Msg delay:1t 'def:<&c>Can not divide by 0! Not dividing %flagName% for %owner%!' - queue clear } - define yamlName 'SQLAPI' - define scriptName 'SQLAPI' - define db '' - define tableName '' - define record '' - if '' { - run s@SQLAPI_Msg delay:1t 'def:<&c>System Offline! Can not divide %flagName% for %owner% by %flagValue% in %tableName%!' - queue clear } - if %record% != null { - define flagExists 'true' - define expires '' - if %expires% == 0 || %expires% > { - define isExpired 'false' } else { - define isExpired 'true' } } else { - define flagExists 'false' - define isExpired 'true' } - if %flagExists% { - define flagVal '' - if %flagVal% !matches decimal { - run s@SQLAPI_Msg delay:1t 'def:<&c>Not dividing %flagName% for %owner%! Current value %flagVal% is not numeric!' - queue clear } } - if %type% == server { - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value / '%flagValue%' WHERE flag='%flagName%';" } } else { - define statement "INSERT INTO %tableName% (flag, value, expiration) VALUES ('%flagName%', '%flagValue%', '%expiration%');" } } else { - define uuid ']:||>' - if %flagExists% { - if %isExpired% { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } else { - define statement "UPDATE %tableName% SET expiration = '%expiration%', value = value / '%flagValue%' WHERE flag='%flagName%' AND uuid='%uuid%';" } } else { - define statement "INSERT INTO %tableName% (uuid, flag, value, expiration) VALUES ('%uuid%', '%flagName%', '%flagValue%', '%expiration%');" } } - inject s@SQLManager_Offline p:managedUpdateStatement ######################### # Command messages msg_set: - run s@SQLAPI_Msg delay:1t 'def:<&7>Set to for %owner%]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_clear: - run s@SQLAPI_Msg delay:1t 'def:<&7>Cleared for %owner%' msg_set_list: - run s@SQLAPI_Msg delay:1t 'def:<&7>Set list flag to for %owner%]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_set_index: - run s@SQLAPI_Msg delay:1t 'def:<&7>Set list to starting at index %index% for %owner%]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_include: - run s@SQLAPI_Msg delay:1t 'def:<&7>Included in list for %owner%]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_insert_index: - run s@SQLAPI_Msg delay:1t 'def:<&7>Included in list starting at index %index% for %owner%]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_remove: - if ]> { - run s@SQLAPI_Msg delay:1t 'def:<&7>Cleared for %owner%' } else { - run s@SQLAPI_Msg delay:1t 'def:<&7>Removed from list for %owner%]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' } msg_increment: - run s@SQLAPI_Msg delay:1t 'def:<&7>Increased for %owner% by ]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_decrement: - run s@SQLAPI_Msg delay:1t 'def:<&7>Decreased for %owner% by ]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_multiply: - run s@SQLAPI_Msg delay:1t 'def:<&7>Multiplied for %owner% by ]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' msg_divide: - run s@SQLAPI_Msg delay:1t 'def:<&7>Divided for %owner% by ]:<&dot>||<&dot> Expires in ].get[2].as_duration.formatted><&dot>>' SQLAPI_ParseOwner: # Usage: type: procedure debug: false definitions: owner script: - define owner ">" - inject locally - announce to_console "<&b>SQLAPI<&co><&c> Must specify valid owner object!" - announce to_console "<&b>SQLAPI<&co><&c> Can not parse %owner%" player: - determine 'player' entity: - determine 'entity' npc: - determine 'npc' element: - if %owner% == server { - determine 'server' } else if %owner% == player { - determine 'thisPlayer' } SQLAPI_GetFlagRecord: # Usage: type: procedure debug: false definitions: owner|flag script: - define type '' - if li@player|entity|npc|server !contains %type% { - announce to_console "<&b>SQLAPI<&co> <&c>Invalid type specified in flag lookup!" - announce to_console "<&b>SQLAPI<&co> <&b>Attempted<&co> %owner% %type% %flag%" - queue clear } - define tableName '' - define db '' - if ! { - announce to_console "<&b>SQLAPI<&co> <&c>Database Offline!" - yaml set 'id:SQLManager_Offline' 'Offline_Cache.databases.%db%.status:offline' - yaml 'savefile:SQLManager/cache.yml' 'id:SQLManager_Offline' - run s@SQLManager p:restart def:SQLAPI|SQLAPI|%db% - determine 'SQLAPI OFFLINE' } - if %owner% == server { - sql id:%db% "query:SELECT flag,value,expiration FROM %tablename% WHERE flag='%flag%';" save:record } else { - define uuid ']:||>' - sql id:%db% "query:SELECT flag,value,expiration FROM %tablename% WHERE flag='%flag%' AND uuid='%uuid%';" save:record } - define record '' - if == 1 { - determine '' } - if != 0 { - announce to_console "<&b>SQLAPI<&co> <&c>%tablename% has records of %flag% for %uuid%!" - announce to_console "<&b>SQLAPI<&co> <&c>Only returning the first record!" - determine '' } SQLAPI_FlagExists: # Usage: type: procedure debug: false definitions: owner|flag script: - define record '' - if '' { - queue clear } - if %record% != null { - determine 'true' } - determine 'false' SQLAPI_IsExpired: # Usage: type: procedure debug: false definitions: owner|flag script: - define record '' - if '' { - queue clear } - if %record% != null { - define expiration '' - if %expiration% == 0 || %expiration% > { - determine 'false' } } - determine 'true' SQLAPI_Expiration: # Usage: type: procedure debug: false definitions: owner|flag script: - define record '' - if '' { - queue clear } - if %record% != null { - define expiration '' - if %expiration% == 0 { - determine '' } - if %expiration% > { - determine '].div[1000]>s].as_duration>' } } SQLAPI_HasFlag: # Usage: type: procedure debug: false definitions: owner|flag script: - define record '' - if '' { - queue clear } - if %record% != null { - define expiration '' - if %expiration% == 0 || %expiration% > { - determine 'true' } } - determine 'false' SQLAPI_GetFlag: # Usage: type: procedure debug: false definitions: owner|flag script: - define record '' - if %record% == null || { - queue clear } - define expiration '' - if %expiration% == 0 || %expiration% > { - define flagVal '' - if { - define flagVal '' - determine ']>' } else { - determine '%flagVal%' } } SQLAPI_ListFlags: # Usage: type: procedure debug: false definitions: owner script: - define type '' - if li@player|entity|npc|server !contains %type% { - announce to_console "<&b>SQLAPI<&co> <&c>Invalid type specified in flag lookup!" - announce to_console "<&b>SQLAPI<&co> <&b>Attempted<&co> %owner% %type%" - queue clear } - define tableName '' - define db '' - if ! { - announce to_console "<&b>SQLAPI<&co> <&c>Database Offline!" - yaml set 'id:SQLManager_Offline' 'Offline_Cache.databases.%db%.status:offline' - yaml 'savefile:SQLManager/cache.yml' 'id:SQLManager_Offline' - run s@SQLManager p:restart def:SQLAPI|SQLAPI|%db% - determine 'SQLAPI OFFLINE' } - define now '' - if %owner% == server { - sql id:%db% "query:SELECT flag FROM %tablename% WHERE expiration>'%now%' OR expiration='0';" save:record } else { - define uuid ']:||>' - sql id:%db% "query:SELECT flag FROM %tablename% WHERE uuid='%uuid%' AND (expiration>'%now%' OR expiration='0');" save:record } - determine '' SQLAPI_GetFlagged: # Usage: type: procedure debug: false definitions: type|flag script: - if li@player|entity|npc !contains %type% { - announce to_console "<&b>SQLAPI<&co> <&c>Invalid type specified in flag lookup!" - announce to_console "<&b>SQLAPI<&co> <&b>Attempted<&co> %owner% %type%" - queue clear } - define tableName '' - define db '' - if ! { - announce to_console "<&b>SQLAPI<&co> <&c>Database Offline!" - yaml set 'id:SQLManager_Offline' 'Offline_Cache.databases.%db%.status:offline' - yaml 'savefile:SQLManager/cache.yml' 'id:SQLManager_Offline' - run s@SQLManager p:restart def:SQLAPI|SQLAPI|%db% - determine 'SQLAPI OFFLINE' } - define now '' - sql id:%db% "query:SELECT uuid FROM %tablename% WHERE flag='%flag%' AND (expiration>'%now%' OR expiration='0');" save:record - determine '' SQLAPI_GetCurrentFlagged: # Usage: type: procedure debug: false definitions: type|flag script: - if li@player|entity|npc !contains %type% { - announce to_console "<&b>SQLAPI<&co> <&c>Invalid type specified in flag lookup!" - announce to_console "<&b>SQLAPI<&co> <&b>Attempted<&co> %owner% %type%" - queue clear } - define tableName '' - define db '' - if ! { - announce to_console "<&b>SQLAPI<&co> <&c>Database Offline!" - yaml set 'id:SQLManager_Offline' 'Offline_Cache.databases.%db%.status:offline' - yaml 'savefile:SQLManager/cache.yml' 'id:SQLManager_Offline' - run s@SQLManager p:restart def:SQLAPI|SQLAPI|%db% - determine 'SQLAPI OFFLINE' } - define now '' - sql id:%db% "query:SELECT uuid FROM %tablename% WHERE flag='%flag%' AND (expiration>'%now%' OR expiration='0');" save:record - if %type% == player { - determine '' } else { - determine '' } SQLAPI_LineWrap: # Turn a long string into a list of smaller strings type: procedure definitions: string|targetLen speed: 0 debug: false script: - define stringLen '' - if { - define lines 'li@' - while { - define low '' - define hi '].as_int||%targetLen%>' - define pass '' - if { - define lines ']||>' - while stop } else { - define brake '' - define increment '' - define passtrim ']:%brake%||>]>]>' - define lines ']||>' - define stringLen '' } - if { - while stop } } - determine '' } else { - determine '' } SQLAPI_Msg: type: item speed: 0 debug: false material: i@human_skull display name: "<&4> [<&6>SQPAPI<&4>]" lore: - <&5>Click for Help script: - ^define text '<&4>[<&6>SQPAPI<&4>]' - ^define hover '<&chr[007B]><&chr[007D]>' - ^define click '/SQPAPI help' - ^define button "text:'%text%',clickEvent:<&chr[007B]>action:run_command,value:'%click%'<&chr[007D]>,hoverEvent:<&chr[007B]>action:show_item,value:'%hover%'<&chr[007d]>" - ^define spacer "text:' '" - ^define color '<&f>' - ^define colorCheck '' - ^if ]> { - define colorCheck ']>' - if { - define color '<&%colorCheck%>' } } - ^if { - define lines '' - foreach { - define msg "text:'%color%]>'" - execute as_server "tellraw <&chr[007B]>text:'',extra:[<&chr[007B]>%button%<&chr[007D]>,<&chr[007B]>%spacer%<&chr[007D]>,<&chr[007B]>%msg%<&chr[007D]>]<&chr[007D]>" } } - ^announce to_console "<&4><&lb><&6>SQPAPI<&4><&rb> %1%" ################################################################################ # # # Configuration Files # # # # These are the default config files. They will be used to build the default # # config file and data storage files. # # # #______________________________________________________________________________# # # #______________________________DO_NOT_EDIT_THIS_DATA___________________________# #______________________________________________________________________________# SQLAPI_Configurations: type: yaml data debug: false config: MySQL: useSql: false connection: keepAlive: 5m retry: 3 retryDelay: 10s host: localhost port: 3306 username: root password: password database: SQLAPI tables: PlayerSQLFLags: dsqlapi_playersqlflags NPCSQLFLags: dsqlapi_npcsqlflags EntitySQLFLags: dsqlapi_entitysqlflags ServerSQLFLags: dsqlapi_serversqlflags ################################################################################ # # # SQL Table Structure # # # # This is where the table structure is defined. It would be best if you do # # not touch anything in this section! # # # #______________________________________________________________________________# # # #______________________________DO_NOT_EDIT_THIS_DATA___________________________# #______________________________________________________________________________# SQLAPI_SQLTables: # This script gets injected from the SQLManager on system start. It sets up some # data it needs and loads the table structure so it's ready for the SQLManager. type: task debug: false script: - define sqlScriptName '' - define sqlFile '' - if yaml unload 'id:%sqlScriptName%' - yaml 'load:%sqlFile%' fix_formatting 'id:%sqlScriptName%' - if ! { - announce "<&c>SQLAPI<&co><&b> An error occurred while loading %sqlScriptname%!" to_console - announce "<&b>SQLAPI<&co><&3> Aborting..." to_console - inject s@%scriptName% p:unload - queue stop } tables: PlayerSQLFLags: columns: id: INT AUTO_INCREMENT PRIMARY KEY uuid: varchar(36) flag: BLOB value: MEDIUMBLOB expiration: BIGINT NPCSQLFLags: columns: id: INT AUTO_INCREMENT PRIMARY KEY uuid: varchar(36) flag: BLOB value: MEDIUMBLOB expiration: BIGINT EntitySQLFLags: columns: id: INT AUTO_INCREMENT PRIMARY KEY uuid: varchar(36) flag: BLOB value: MEDIUMBLOB expiration: BIGINT ServerSQLFLags: columns: id: INT AUTO_INCREMENT PRIMARY KEY flag: BLOB value: MEDIUMBLOB expiration: BIGINT #