-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpicker.p6
150 lines (135 loc) · 2.77 KB
/
picker.p6
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
use fatal;
constant FILE = 'servers.txt';
my %server;
try {
my $server = slurp FILE;
%server = $server.lines.map(*.split("=", 2).hash);
CATCH {
default {
write-server-file('');
say "Created default server list file";
}
}
}
say "Welcome to ServerPick6r.";
help unless %server;
list-servers;
while $_ = lc prompt "Command? " {
when "?" | "help" {
help
}
when "list" | "ls" {
list-servers
}
when /:s ^p[lay]? (\w+)$/ {
play(~$0)
}
when /:s ^[p[lay]? ]?(\d+)$/ {
play(+$0)
}
when /:s ^[remove|rm] (\d+)$/ {
remove(+$0);
}
when /:s ^[remove|rm] (\w+)$/ {
remove(~$0);
}
when /:s ^[add|'+'] (\w+) (\S+)$/ {
add(~$0, ~$1)
}
}
sub help {
say q:to/HELP/;
Available commands:
- <number>: Launches server n° <number>
- p, play <server>: Launches server with name or ID <number>
- ls, list: Lists the available servers
- add, + <name> <url>: Add a server with the logon server <url> for the name <name>
- help, ?: Displays this message
HELP
}
sub list-servers {
say "Available servers" if %server;
my $i;
for %server.keys.sort -> $name {
say "[{++$i}] $name (%server{$name})"
}
}
multi sub play(Int $server) {
if $server < 1 || $server > +%server {
say "Wrong server ID";
} else {
play(%server.keys.sort[$server - 1]);
}
}
multi sub play(Str $name) {
if %server{$name}:exists {
launch($name);
} else {
my @fuzzy-matches = %server.keys.grep(*.starts-with($name));
given @fuzzy-matches {
when * > 1 {
say "Ambiguous matches:";
.say for @fuzzy-matches.map({" - $_"});
}
when 1 {
my $name = @fuzzy-matches[0];
say "Found fuzzy match $name";
launch($name);
}
default {
say "Invalid server";
}
}
}
}
multi sub remove(Int $server) {
if $server < 1 || $server > +%server {
say "Wrong server ID";
list-servers;
} else {
my $name = %server.keys.sort[$server - 1];
say "Removing server $name (%server{$name})";
%server{$name}:delete;
write-server-hash;
}
}
sub launch(Str $name) {
say "Playing on $name (%server{$name})";
my $realmlist = "set realmlist %server{$name}";
for dir('Data') {
my $rl-file = "$_/realmlist.wtf";
next unless .IO.d && $rl-file.IO ~~ :e & :f;
spurt $rl-file, $realmlist;
}
run "Wow.exe";
exit;
}
multi sub remove(Str $server) {
say $server;
}
sub add(Str $name, Str $url) {
if %server{$name}:exists {
say "A server with this name already exists";
return;
}
if $name ~~ /'='/ {
say "Invalid server name";
return;
}
say "Adding server <$name> for url <$url>";
%server{lc $name} = lc $url;
write-server-hash;
}
sub write-server-hash {
my $server = %server.kv.map({"$^k=$^v"}).join("\n");
write-server-file $server;
}
sub write-server-file(Str $contents) {
spurt FILE, $contents;
CATCH {
default {
say "Unable to write server file";
exit;
}
}
}