Paste #4514: Config File Generator Example

Date: 2014/05/22 19:11:04 UTC-07:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


################################################################################
#                                                                              #
# Configurations                                                               #
#                                                                              #
# These are the default configurations. They will be used to build the user    #
# level config files on first run. Each parent node defines the file type and  #
# the child nodes that follow are the configurations for that config file type.#
#                                                                              #
#______________________________________________________________________________#
#                                                                              #
#__________DO_NOT_EDIT_THIS_FILE___EVERYTHING_IS_CONFIGURABLE_IN_GAME__________#
#                                                                              #
#______________________________________________________________________________#

'ConfigFileGeneratorTest_Configurations':
  type: task
  debug: false

  # Where you save this script file
  scriptPath: 'scripts/Network/Utilities/ConfigFileGeneratorTest.yml'


# ------ Single Value Test Config ------ #

  singleValues:
    keyA: 1
    keyB: 0.1
    keyC: -1
    keyD: NaN
    keyE: This is a StRiNg!


# ------ Single Lists ------ #

  singleLists:
    listA:
      - 1
      - 0.1
      - -1
      - NaN
      - This is a StRiNg!
    listB:
      - 2
      - 0.2
      - -2
      - nAn
      - This is a sTrInG!

# ------ Recursive Lists ------ #

  recursiveLists:
    list1:
      list1A:
        list1A1:
          key1A1A: 1
          list1A1A:
            - 1
            - 2
        list1A2:
          list1A2A:
            key1A2A1: 1
            list1A2A1:
              - 1
              - 2
    list2:
      list2A:
        key2A1: 1
        list2A1:
          - 1
          - 2


################################################################################
#
# Config File Generator Test Helper
#
#
# This script tells the s@ConfigFileGenerator which files to generate based
# on the configs above.
# 
'ConfigFileGeneratorTestHelper':

  type: task
  debug: true
  script:
    - ^define readID 'ConfigFileGeneratorTest'
    - ^define basePath '<def[readID]>_Configurations'
    - ^define scriptPath '<s@<def[basePath]>.constant[scriptPath] || null>'
    - ^if <def[scriptPath].is[==].to[null]> {
      - announce "<&4><&n><def[readID]> <&4>is not a valid readID."
      - inject s@FinishCommand
      }
    - ^yaml 'load:<def[scriptPath]>' 'id:<def[readID]>]'

    - ^define keylist '<yaml[<def[readID]>].list_keys[<def[basePath]>].exclude[type|debug|scriptPath]>'

    - ^foreach <def[keylist]> {
      - define node <def[value]>

      - if !<server.has_file[%readID%/%node%.yml]> || <def[forcewrite]> {
        - if !<def[dryrun]> {
          - announce "<&5>Generating default %node%.yml file..." to_console
          }
        - announce "<&5>Generating default %node%.yml file..." to_flagged:admin
        - announce "" to_flagged:admin
        - define writePath '%node%'
        - define writeID '%readID%_%node%'
        - yaml create 'id:%writeID%'
        - run s@ConfigFileGeneratorTest def:<def[readID]>|<def[writeID]>|<def[basePath]>|<def[writePath]>|<def[dryrun]>|<def[verbose]>|<def[forcewrite]> instantly
        - if !<def[dryrun]> {
          - yaml 'savefile:%readID%/%node%.yml' 'id:%writeID%'
          - announce "<&e>%node%.yml <&6>Save Complete!" to_console
          - announce "<&e>%node%.yml <&6>Save Complete!" to_flagged:admin
          - announce "" to_flagged:admin
          - yaml unload 'id:%writeID%'
          }
          else {
          - announce "<&6>%node%.yml Dryrun Complete!" to_flagged:admin
          - announce "" to_flagged:admin
          - yaml unload 'id:%writeID%'
          }
        }
        else {
        - if !<def[dryrun]> {
          - announce "<&a>%node%.yml already exists!" to_console
          }
        - announce "<&a>%node%.yml already exists!" to_flagged:admin
        }
      }
    - ^if !<def[dryrun]> {
      - announce "<&3><def[readID]> has Completed!" to_console
      }
    - ^announce "<&3><def[readID]> has Completed!" to_flagged:admin


################################################################################
#
# Configuration File Generator
#
#
# This script generates default config files based on the definitions passed to
# it. It should be flexible enough to handle any script.
#
#   - run s@ConfigFileGenerator def:%readID%|%writeID%|%basePath%|%writePath%|%dryrun%|%verbose%|%forcewrite% instantly
# 

'ConfigFileGeneratorTest':
  type: task
  debug: true
  definitions: readID|writeID|basePath|writePath|dryrun|verbose|forcewrite
  script:
    - ^define keylist '<yaml[<def[readID]>].list_keys[<def[basePath]>.<def[writePath]>]>'
    - ^if <def[keylist]> != null {
      - inject s@ConfigFileGeneratorTest p:foreachKeylist instantly
      }
      else {
      - define entry '<yaml[<def[readID]>].read[<def[basePath]>.<def[writePath]>]>'
      - define entryList '<yaml[<def[readID]>].read[<def[basePath]>.<def[writePath]>].as_list>'
      - if !<def[dryrun]> {
        - announce "<&a>Next Path<&co> <&b><def[basePath]>.<def[writePath]>" to_console
        }
      - if <def[dryrun]> || <def[verbose]> {
        - announce "<&a>Next Path<&co> <&b><def[basePath]>.<def[writePath]>" to_flagged:admin
        }
      - if <def[entryList].as_list.size.is[MORE].than[1]> {
        - inject s@ConfigFileGeneratorTest p:foreachEntrylist instantly
        }
        else {
        - inject s@ConfigFileGeneratorTest p:singleEntry instantly
        }
      }

  foreachKeylist:
    - foreach <def[keylist]> {
      - define key '<def[value]>'
      - define oldWritePath '<def[writePath]>'
      - define writePath '%writePath%.%key%'
      - run s@ConfigFileGeneratorTest def:<def[readID]>|<def[writeID]>|<def[basePath]>|<def[writePath]>|<def[dryrun]>|<def[verbose]>|<def[forcewrite]> instantly
      - define writePath '%oldWritePath%'
      }

  foreachEntrylist:
    - yaml 'write:%writePath%' 'id:%writeID%'
    - foreach <def[entryList]> {
      - if !<def[dryrun]> {
        - announce "<&9>%writePath%<&co> <&2>%value%" to_console
        - yaml set <def[writePath]>:->:<def[value]> 'id:<def[writeID]>'
        }
      - if <def[dryrun]> || <def[verbose]> {
        - announce "<&9>%writePath%<&co> <&2>%value%" to_flagged:admin
        }
      }
    - if <def[dryrun]> || <def[verbose]> {
      - announce "<&3>*-----*" to_flagged:admin
      - announce "" to_flagged:admin
      }

  singleEntry:
    - if <def[dryrun].is[==].to[false]> {
      - announce "<&c>%writePath%<&co> <&e>%entry%" to_console
      - yaml 'write:<def[writePath]>' 'value:<def[entry]>' 'id:<def[writeID]>'
      }
    - if <def[dryrun].is[==].to[true]> || <def[verbose].is[==].to[true]> {
      - announce "<&c>%writePath%<&co> <&e>%entry%" to_flagged:admin
      - announce "<&4>*-----*" to_flagged:admin
      - announce "" to_flagged:admin
      }



################################################################################
#
# Configuration File Generator Command
#
#
'ConfigFileGeneratorTestCommand':
  type: world
  debug: false
  events:

    on cfgtest command:
    - if !<player.has_permission[denizen.cfgtest]> queue stop
    - define dryrun '<tern[<c.args.contains[--dryrun]>]:true || false>'
    - define verbose '<tern[<c.args.contains[--verbose]>]:true || false>'
    - define forcewrite '<tern[<c.args.contains[--force]>]:true || false>'
    - if <c.args.find[-f].is[MORE].than[0]> {
      - define file <c.args.get[<c.args.find[-f].add[1].as_int>]>
      }
    - if <c.args.find[-i].is[MORE].than[0]> {
      - define readID <c.args.get[<c.args.find[-i].add[1].as_int>]>
      - narrate "%readID%"
      }
      else {
      - narrate "<&4>You must specify the readID!"
      }
    - narrate "<&b>dryrun<&co> <&a>%dryrun%"
    - narrate "<&b>verbose<&co> <&a>%verbose%"
    - narrate "<&b>forcewrite<&co> <&a>%forcewrite%"
    - inject s@ConfigFileGeneratorTestHelper
    - inject s@FinishCommand



################################################################################
#
# Command Testing
#
#
'TestCommandHandler':
  type: world
  debug: false
  events:

    on cmdtest command:
    - if !<player.has_permission[denizen.cmdtest]> queue stop
    - define dryrun '<tern[<c.args.contains[--dryrun]>]:true || false>'
    - define verbose '<tern[<c.args.contains[--verbose]>]:true || false>'
    - define forcewrite '<tern[<c.args.contains[--force]>]:true || false>'
    - if <c.args.find[-a].is[MORE].than[0]> {
      - define a <c.args.get[<c.args.find[-a].add[1].as_int>]>
      - narrate "<&b>a<&co> <&a>%a%"
      }
    - if <c.args.find[-b].is[MORE].than[0]> {
      - define b <c.args.get[<c.args.find[-b].add[1].as_int>]>
      - narrate "<&b>b<&co> <&a>%b%"
      }
    - if <c.args.find[-c].is[MORE].than[0]> {
      - define c <c.args.get[<c.args.find[-c].add[1].as_int>]>
      - narrate "<&b>c<&co> <&a>%c%"
      }
    - narrate "<&b>dryrun<&co> <&a>%dryrun%"
    - narrate "<&b>verbose<&co> <&a>%verbose%"
    - inject s@FinishCommand

################################################################################
#
# Clear Chat Command
#
#
'ClearChatCommand':
  type: world
  debug: false
  events:

    on clearchat command:
    - if !<player.has_permission[denizen.clearchat]> queue stop
    - repeat 100 {
      - narrate ""
      }
    - inject s@FinishCommand