Paste #40570: Chat Channels

Date: 2017/03/08 16:12:35 UTC-08:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


Chat_Event:
  type: world
  debug: minimal
  events:
    on player chats:
      - determine cancelled
      - if <player.has_flag[chat.channel]>:
        - define channel <player.flag[chat.channel]>
      - else:
        - define channel local
      - run Chat_Handler_Player sender:<player>|message:<context.message>|channel:<[channel]>


Chat_Handler_Player:
  type: task
  debug: minimal
  script:
    - define sender <player[<[sender]>]>
    - if <[channel]> == local:
      - tell <[sender]> <procedure[script:Message_Constructor_Local_Self|sender:<[sender].name>|message:<[message]>].message>
      - foreach start <[sender].location.nearby_entities[type:minecraft:player|range:5]> --save recipient:
        - if <[sender]> == <[recipient]>:
          - foreach next
        - tell <[recipient]> <procedure[script:Message_Constructor_Local|sender:<[sender].name>|message:<[message]>].message>
    - else if <[channel]> == global:
      - tell <[sender]> <procedure[script:Message_Constructor_Global_Self|sender:<[sender].name>|message:<[message]>].message>
      - foreach start <[sender].location.world.entities[minecraft:player]> --save recipient:
        - if <[sender]> == <[recipient]>:
          - foreach next
        - tell <[recipient]> <procedure[script:Message_Constructor_Global|sender:<[sender].name>|message:<[message]>].message>
    - else if <[channel]> == party:
      - tell <[sender]> <procedure[script:Message_Constructor_Party_Self|sender:<[sender].name>|message:<[message]>].message>
      - foreach start <yaml[parties].read[<[sender].flag[party.id]>.members]> --save recipient:
        - if <[sender]> == <[recipient]>:
          - foreach next
        - tell <[recipient]> <procedure[script:Message_Constructor_Party|sender:<[sender].name>|message:<[message]>].message>
    - else if <[channel]> == clan:
      - tell <[sender]> <procedure[script:Message_Constructor_Clan_Self|sender:<[sender].name>|message:<[message]>].message>
      - foreach start <yaml[clans].read[<[sender].flag[clan.name]>.members]> --save recipient:
        - if <[sender]> == <[recipient]>:
          - foreach next
        - tell <[recipient]> <procedure[script:Message_Constructor_Clan|sender:<[sender].name>|message:<[message]>].message>

#Chat_Handler_Npc:
#  type: task
#  debug: minimal
#  script:
#    - define sender <npc[<[sender]>]>
#    - if <[channel]> == local:
#      - foreach start <[sender].location.nearby_entities[type:minecraft:player|range:5]> --save recipient:
#        - tell <[recipient]> <procedure[script:Message_Constructor_Local|sender:<[sender]>|message:<[message]>].message>
#    - else if <[channel]> == global:
#      - foreach start <[sender].location.world.entities[minecraft:player]> --save recipient:
#        - tell <[recipient]> <procedure[script:Message_Constructor_Global|sender:<[sender]>|message:<[message]>].message>
#    - else if <[channel]> == party:
#    - else if <[channel]> == clan:

Message_Constructor_Local:
  type: procedure
  debug: minimal
  script:
    - define color white
    - define channel "<texts.for_input[text:[L] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|hover_text:<texts.for_input[text:whisper|color:light_purple]>|click_type:suggest|click_data:/w <context.sender> ]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Local_Self:
  type: procedure
  debug: minimal
  script:
    - define color white
    - define channel "<texts.for_input[text:[L] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>|hover_text:<texts.for_input[text:change title|color:<[color]>]>|click_type:execute|click_data:/title]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|style:bold]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Global:
  type: procedure
  debug: minimal
  script:
    - define color yellow
    - define channel "<texts.for_input[text:[G] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|hover_text:<texts.for_input[text:whisper|color:light_purple]>|click_type:suggest|click_data:/w <context.sender> ]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Global_Self:
  type: procedure
  debug: minimal
  script:
    - define color yellow
    - define channel "<texts.for_input[text:[G] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>|hover_text:<texts.for_input[text:change title|color:<[color]>]>|click_type:execute|click_data:/title]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|style:bold]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Party:
  type: procedure
  debug: minimal
  script:
    - define color blue
    - define channel "<texts.for_input[text:[G] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|hover_text:<texts.for_input[text:whisper|color:light_purple]>|click_type:suggest|click_data:/w <context.sender> ]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Party_Self:
  type: procedure
  debug: minimal
  script:
    - define color blue
    - define channel "<texts.for_input[text:[G] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>|hover_text:<texts.for_input[text:change title|color:<[color]>]>|click_type:execute|click_data:/title]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|style:bold]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Clan:
  type: procedure
  debug: minimal
  script:
    - define color green
    - define channel "<texts.for_input[text:[G] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|hover_text:<texts.for_input[text:whisper|color:light_purple]>|click_type:suggest|click_data:/w <context.sender> ]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Message_Constructor_Clan_Self:
  type: procedure
  debug: minimal
  script:
    - define color green
    - define channel "<texts.for_input[text:[G] |color:<[color]>|hover_text:<texts.for_input[text:change channel|color:<[color]>]>|click_type:execute|click_data:/channel]>"
    - define clan "<texts.for_plain[<text[&lt&gt ].unescaped>]>"
    - define player_color blue
    - define title "<texts.for_input[text:|color:<[player_color]>|hover_text:<texts.for_input[text:change title|color:<[color]>]>|click_type:execute|click_data:/title]>"
    - define name "<texts.for_input[text:<context.sender> |color:<[player_color]>|style:bold]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<formatted_text[<context.message>].plain>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[clan]>].append[<[title]>].append[<[name]>].append[<[message]>]>

Channel_Command:
  type: command
  debug: minimal
  name:
    - channel
    - ch
  description: Selects the specified chat channel.
  script:
    - if <context.source> != player:
      - echo "This is a player command only!"
      - stop
    - if <context.arguments.size> > 1:
      - tell <player> "<texts.for_input[text:Too many arguments! Usage: /ch{annel} (l{ocal}/g{lobal}/p{arty}/c{lan}) |color:red]>"
    - else if <context.arguments.size> == 0:
      - define select "<texts.for_input[text:Select a channel: |color:red]>"
      - define local "<texts.for_input[text:[L] |color:white|hover_text:<texts.for_input[text:change channel|color:white]>|click_type:execute|click_data:/channel local]>"
      - define global "<texts.for_input[text:[G] |color:yellow|hover_text:<texts.for_input[text:change channel|color:yellow]>|click_type:execute|click_data:/channel global]>"
      - define party "<texts.for_input[text:[P] |color:blue|hover_text:<texts.for_input[text:change channel|color:blue]>|click_type:execute|click_data:/channel party]>"
      - define clan "<texts.for_input[text:[C] |color:green|hover_text:<texts.for_input[text:change channel|color:green]>|click_type:execute|click_data:/channel clan]>"
      - tell <player> <[select].append[<[local]>].append[<[global]>].append[<[party]>].append[<[clan]>]>
    - else:
      - define channel <context.arguments.get[1]>
      - if <[channel].starts_with_cased[l]>:
        - flag <player> chat.channel:local
        - tell <player> "<texts.for_input[text:Channel changed to |color:red].append[<texts.for_input[text:local|color:white]>]>"
      - else if <[channel].starts_with_cased[g]>:
        - flag <player> chat.channel:global
        - tell <player> "<texts.for_input[text:Channel changed to |color:red].append[<texts.for_input[text:global|color:yellow]>]>"
      - else if <[channel].starts_with_cased[p]>:
        - flag <player> chat.channel:party
        - tell <player> "<texts.for_input[text:Channel changed to |color:red].append[<texts.for_input[text:party|color:blue]>]>"
      - else if <[channel].starts_with_cased[c]>:
        - flag <player> chat.channel:clan
        - tell <player> "<texts.for_input[text:Channel changed to |color:red].append[<texts.for_input[text:clan|color:green]>]>"

Whisper_Command:
  type: command
  debug: minimal
  name:
    - w
    - whisper
  description: Sends a private message to a player.
  script:
    - if <context.source> != player:
      - echo "This is a player command only!"
      - stop
    - if <context.arguments.size> < 2:
      - tell <player> "<texts.for_input[text:You must specify a recipient and a message! Usage: /w{hisper} [name] [message]|color:red]>"
      - stop
    - define recipient <player[<context.arguments.get[1]>]>
    - define message "<context.raw_arguments.after[<context.arguments.get[1]> ]>"
    #- if <player> == <[recipient]>:
    #  - tell <player> "<texts.for_input[text:You can't send a private message to yourself!|color:red]>"
    #  - stop
    - tell <player> <procedure[script:Message_Constructor_Whisper_Self|recipient:<[recipient]>|message:<[message]>].message>
    - tell <[recipient]> <procedure[script:Message_Constructor_Whisper|sender:<player>|message:<[message]>].message>

Message_Constructor_Whisper:
  type: procedure
  debug: minimal
  script:
    - define sender <player[<context.sender>]>
    - define color light_purple
    - define channel "<texts.for_input[text:[W] |color:<[color]>]>"
    - define name "<texts.for_input[text:<[sender].name> |color:<[color]>|hover_text:<texts.for_input[text:whisper|color:light_purple]>|click_type:suggest|click_data:/w <[sender].name> ]>"
    - define spacer "<texts.for_input[text:➝ |color:<[color]>]>"
    - define you "<texts.for_input[text:you |color:<[color]>|style:bold]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<context.message>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[name]>].append[<[spacer]>].append[<[you]>].append[<[message]>]>

Message_Constructor_Whisper_Self:
  type: procedure
  debug: minimal
  script:
    - define recipient <player[<context.recipient>]>
    - define color light_purple
    - define channel "<texts.for_input[text:[W] |color:<[color]>]>"
    - define you "<texts.for_input[text:You |color:<[color]>|style:bold]>"
    - define spacer "<texts.for_input[text:➝ |color:<[color]>]>"
    - define name "<texts.for_input[text:<[recipient].name> |color:<[color]>|hover_text:<texts.for_input[text:whisper|color:light_purple]>|click_type:suggest|click_data:/w <[recipient].name> ]>"
    - define message "<texts.for_input[text:» |color:<[color]>].append[<texts.for_input[text:<context.message>|color:<[color]>|style:italics]>]>"
    - determine message <[channel].append[<[you]>].append[<[spacer]>].append[<[name]>].append[<[message]>]>