blob: d347364fdb9801a17d5c38f02a030bef03187a0c (
plain)
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
|
package moe.nea89.website
import kotlinext.js.require
import kotlinx.browser.document
import kotlinx.html.dom.append
import kotlinx.html.dom.create
import kotlinx.html.img
import kotlinx.html.js.a
import kotlinx.html.js.div
import kotlinx.html.js.p
import styled.injectGlobal
import kotlin.time.Duration.Companion.milliseconds
val defaultFileSystem = fileSystem {
"etc" {
"passwd" text "hunter2"
}
"home/nea" {
"todo" text """
| - git gud
| - finish this website
| - convince the general public that comic sans is a viable font
""".trimMargin()
"moisturized" image require("images/moisturized.jpg")
"download" download require("images/me.jpeg")
}
"flag" text "CTF{12345abcdefghijklmonp3.1.4.1.5.9.2.8}"
}
fun main() {
require("@fontsource/comic-mono/index.css")
injectGlobal(Styles.global)
val root = document.body!!.append.div()
val console = KConsole.createFor(root, fileSystem = defaultFileSystem)
console.registerCommand(command("cwd", "pwd") {
val fa = requireFileAccessor()
console.addLine(fa.currentDir.joinToString(separator = "/", prefix = "/"))
})
console.registerCommand(command("cd") {
val fa = requireFileAccessor()
val path = args.singleOrNull()
if (path == null) {
console.addLine("Usage: cd <directory>")
return@command
}
val error = fa.cd(path)
if (error != null) {
console.addLine("cd: ${error.name}")
}
})
console.registerCommand(command("ls") {
val fa = requireFileAccessor()
val path = when (args.size) {
0 -> "."
1 -> args[0]
else -> {
console.addLine("Usage: ls [directory or file]")
return@command
}
}
val file = fa.resolve(path)
if (file == null) {
console.addLine("ls: Could not find file or directory")
return@command
}
when (file) {
is KFile.Directory -> {
val longestName = file.files.keys.maxOf { it.length }
file.files.forEach { (name, file) ->
wait(200.milliseconds)
console.addLine(
name + " ".repeat(longestName + 1 - name.length) + file.fileType
)
console.rerender()
}
}
else -> "is a ${file.fileType}"
}
})
console.registerCommand(command("color") {
console.addLine("This is a ", red("red"), " word: ", green("1.0"), " ", blue("BLUUEEE"))
})
console.registerCommand(command("cat") {
val fa = requireFileAccessor()
val path = when (args.size) {
1 -> args[0]
else -> {
console.addLine("Usage: cat [directory or file]")
return@command
}
}
val file = fa.resolve(path)
if (file == null) {
console.addLine("cat: Could not find file or directory")
return@command
}
when (file) {
is KFile.Directory -> console.addLine("cat: Is a directory")
is KFile.Text -> console.addMultilineText(file.text)
is KFile.Image -> console.addLine(document.create.p {
img(src = file.url)
})
is KFile.Download -> {
val link = document.create.a(file.url)
link.download = file.name.last()
document.body!!.append(link)
link.click()
link.remove()
console.addLine("Download started")
}
}
})
console.registerCommand(command("dick", "cock") {
console.addMultilineText("Hehe")
})
console.registerCommand(command("boob", "booob") {
console.addMultilineText(boobs)
})
}
|