Date: 2020/05/13 09:14:43 UTC-07:00
Type: Denizen Script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# $ ██ [ [c]usage:
# - ██ | [c]/Skin Reset | Resets your skin to your default skin
# - ██ | [c]/Skin Save PlayerName | Saves a skin by the PlayerName's Skin
# - ██ | [c]/Skin Save Name URL (slim) | Saves a skin by the URL pasted -
# - ██ | optionally making it Slim if specified
# - ██ | [c]/Skin Set Name | Sets a skin by the name you saved -
# - ██ | if it doesn't exist, you'll get whatever that player's name's skin is!
# - ██ | [c]/Skin List | Lists the skins you've saved
# - ██ | [c]/Skin Delete Name | Deletes a skin by the name you saved
Skin_Command:
type: command
name: skin
debug: false
description: Manages your player's skin.
usage: /skin (Reset/Set <<>Name<>>/Save <<>PlayerName<>>/Save <<>Name<>> URL<>>/List/Delete <<>Name<>>
tab complete:
- define Arg1 <list[Reset|Set|Save|Delete|List|Rename]>
- define Arg2 <list[Set|Delete|Rename]>
- if <context.args.size> == 0:
- determine <[Arg1]>
# @ ██ [ /skin Arg ] ██
- define Whitespace <context.raw_args.ends_with[<&sp>]>
- else if <context.args.size> == 1 && !<[Whitespace]>:
- determine <[Arg1].filter[starts_with[<context.args.get[1]>]]>
# @ ██ [ Does the player even have saved skins to tab complete for? ] ██
- if !<player.has_flag[SuperSuit_SavedSkins]>:
- stop
- define SavedSkins <player.flag[SuperSuit_SavedSkins].parse[before[/]]>
# @ ██ [ /skin Arg\s ] ██
- if <context.args.size> == 1 && <[Arg2].contains[<context.args.get[1]>]> && <[Whitespace]>:
- determine <[SavedSkins]>
# @ ██ [ /skin Arg\sArg ] ██
- else if <context.args.size> == 2 && <[Arg2].contains[<context.args.get[1]>]> && !<[Whitespace]>:
- determine <[SavedSkins].filter[starts_with[<context.args.get[2]>]]>
syntax:
- narrate "<&e>Available Sub-Commands: <&a><list[Reset|Set|Save|Delete|List|Rename].separated_by[<&6>, <&a>]>"
- stop
script:
# @ ██ [ Check for args ] ██
- if <context.args.size> == 0:
- inject locally syntax instantly
- define SkinArg <context.args.get[1]>
- choose <[SkinArg]>:
# @ ██ [ /skin reset - Resets the player's skin to their own ] ██
- case Reset:
- adjust <player> skin:<player.name>
- narrate "<&a>Skin reset."
# @ ██ [ /skin set <Name> - Sets the player's skin to the Name they save their skin as ] ██
- case Set:
- if <context.args.size> != 2:
- narrate "<&e>Available Sub-Commands: <&a><list[Reset|Set|Save|Delete|List|Rename].separated_by[<&6>, <&a>]>"
# @ ██ [ Check if player saved skin ] ██
- define SkinName <context.args.get[2]>
- if <player.has_flag[SuperSuit_SavedSkins]>:
- if <player.flag[SuperSuit_SavedSkins].parse[before[/]].contains[<[SkinName]>]>:
# @ ██ [ Skin the owner player's skin if skin name not saved ] ██
- define SkinBlob:<player.flag[SuperSuit_SavedSkins].map_get[<[SkinName]>]>
- adjust <player> skin_blob:<[SkinBlob]>
- narrate "<&a>Skin set to: <&e><[SkinName]>"
- stop
- adjust <player> skin:<[SkinName]>
- narrate "<&a>Skin set to: <&e><[SkinName]>"
# @ ██ [ /skin save <PlayerName> - Saves a skin by the PlayerName's Skin ] ██
# @ ██ [ /Skin Save Name URL (slim) | Saves a skin by the URL pasted - optionally making it Slim if specified ] ██
- case Save:
- if !<list[2|3|4].contains[<context.args.size>]>:
- inject locally syntax instantly
# @ ██ [ Check if specifying a player's name instead of name&URL ] ██
- define SkinName <context.args.get[2]>
- if <context.args.size> == 2:
- adjust <player> skin:<[SkinName]>
- flag player SuperSuit_SavedSkins:->:<[SkinName]>/<player.blob_skin>
- narrate "<&a>Skin saved: <&e><[SkinName]>"
- narrate "<&a>Skin set to: <&e><[SkinName]>"
- stop
- define SkinUrl <context.args.get[3]>
- define SkinModel <context.args.get[4].to_lowercase||empty>
# @ ██ [ Check if the player already has a skin saved as this name ] ██
- if <player.has_flag[SuperSuit_SavedSkins]>:
- if <player.flag[SuperSuit_SavedSkins].parse[before[/]].contains[<[SkinName]>]>:
- narrate "<&c>The specified skin name already exists: <&e><[SkinName]>"
- stop
# @ ██ [ Validate skin model ] ██
- if !<list[empty|slim].contains[<[SkinModel]>]>:
- narrate "<&c>You must specify either empty or slim."
- stop
# @ ██ [ webget skin from api ] ██
- narrate "<&a>Retrieving the requested skin..."
- define key <util.random.uuid>
- run skin_url_task def:<[key]>|<[SkinUrl]>|<[SkinModel]> id:<[key]> instantly
- while <queue.exists[<[key]>]>:
- if <[loop_index]> > 120:
- queue <queue[<[key]>]> clear
- narrate "<&a>The request timed out. Is the url valid?"
- stop
- wait 5t
# $ ██ [ Quick sanity check - ideally this should never be true ] ██
- if !<server.has_flag[<[key]>]>:
- stop
- if <server.flag[<[key]>]> == null:
- narrate "<&a>Failed to retrieve the skin from the provided link. Is the url valid?"
- flag server <[key]>:!
- stop
- yaml loadtext:<server.flag[<[key]>]> id:response
- if !<yaml[response].contains[data.texture]>:
- narrate "<&a>An unexpected error occurred while retrieving the skin data. Please try again."
- else:
- define SkinBlob <yaml[response].read[data.texture.value]>;<yaml[response].read[data.texture.signature]>
- flag server <[key]>:!
- yaml unload id:response
# @ ██ [ Save & adjust the player's skin ] ██
- flag player SuperSuit_SavedSkins:->:<[SkinName]>/<[SkinBlob]>
- narrate "<&a>Skin saved: <&e><[SkinName]>"
- adjust <player> Skin_Blob:<[SkinBlob]>
- narrate "<&a>Skin set to: <&e><[SkinName]>"
# @ ██ [ /delete <SkinName> - Deletes the player's saved skin by this name ] ██
- case Delete:
- if <context.args.size> != 2:
- inject locally syntax instantly
# @ ██ [ Check if name to delete even exists ] ██
- define SkinName <context.args.get[2]>
- if <player.has_flag[SuperSuit_SavedSkins]>:
- if !<player.flag[SuperSuit_SavedSkins].parse[before[/]].contains[<[SkinName]>]>:
- narrate "<&a>Skin name does not exist: <&e><[SkinName]>"
- stop
- define SkinBlob <player.flag[SuperSuit_SavedSkins].map_get[<[SkinName]>]>
- flag player SuperSuit_SavedSkins:<-:<[SkinName]>/<[SkinBlob]>
- narrate "<&a>Skin deleted: <&e><[SkinName]>"
# @ ██ [ /skin list - Shows you the list of saved skins ] ██
- case List:
- if <context.args.size> != 1:
- inject locally syntax instantly
# @ ██ [ Check if player even has skins ] ██
- if !<player.has_flag[SuperSuit_SavedSkins]>:
- narrate "<&c>You have no saved skins."
- stop
- narrate "<&a>Available Skins:"
- narrate "<&a><player.flag[SuperSuit_SavedSkins].parse[before[/]].separated_by[<&e>, <&a>]>"
# @ ██ [ /skin rename <OldName> <NewName> - Renames a skin from NameA to NameB ] ██
- case Rename:
- if <context.args.size> != 3:
- inject locally syntax instantly
# @ ██ [ Check if player even has skins ] ██
- if !<player.has_flag[SuperSuit_SavedSkins]>:
- narrate "<&c>You have no saved skins."
- stop
# @ ██ [ Check if old skin name is valid ] ██
- define OldSkinName <context.args.get[2]>
- if <player.has_flag[SuperSuit_SavedSkins]>:
- if !<player.flag[SuperSuit_SavedSkins].parse[before[/]].contains[<[OldSkinName]>]>:
- narrate "<&a>You do not have this skin saved: <&e><[OldSkinName]>"
- stop
# @ ██ [ Check if new skin name exists already ] ██
- define NewSkinName <context.args.get[3]>
- if <player.has_flag[SuperSuit_SavedSkins]>:
- if <player.flag[SuperSuit_SavedSkins].parse[before[/]].contains[<[NewSkinName]>]>:
- narrate "<&a>The specified skin name already exists: <&e><[NewSkinName]>"
- stop
# @ ██ [ Swaperonies ] ██
- define SkinBlob <player.flag[Behrry.Essentials.SavedSkins].map_get[<[OldSkinName]>]>
- flag player SuperSuit_SavedSkins:->:<[NewSkinName]>/<[SkinBlob]>
- flag player SuperSuit_SavedSkins:<-:<[OldSkinName]>/<[SkinBlob]>
- narrate "<&e>Skin<&6>: <&a><[OldSkinName]> <&e>renamed to<&6>: <&a><[NewSkinName]>"
- default:
- narrate "<&a>Available Sub-Commands: <&a>Reset<&6>, <&a>Set <&6>(<&a>Name<&6>), <&a>Save <&6>(<&a>url<&6>)"
- stop
# - Thanks mergu
skin_url_task:
type: task
debug: false
definitions: key|url|model
script:
- define req https://api.mineskin.org/generate/url
- if <[model]> == slim:
- define req <[req]>?model=slim
- ~webget <[req]> post:url=<[url]> timeout:30s save:res
- flag server <[key]>:<entry[res].result||null>