commit d3978ee3e41efc3b0e688d85b1a992727c4accee Author: Sebastian Korotkiewicz Date: Fri Apr 18 18:15:27 2025 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ec9396 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist/* +!dist/.gitkeep \ No newline at end of file diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..7d80df4 --- /dev/null +++ b/bun.lock @@ -0,0 +1,222 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "irc-sekor", + "dependencies": { + "pug": "^3.0.3", + "sass": "^1.86.3", + }, + "devDependencies": { + "nodemon": "^3.1.9", + }, + }, + }, + "packages": { + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="], + + "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + + "acorn": ["acorn@7.4.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + + "assert-never": ["assert-never@1.4.0", "", {}, "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA=="], + + "babel-walk": ["babel-walk@3.0.0-canary-5", "", { "dependencies": { "@babel/types": "^7.9.6" } }, "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "character-parser": ["character-parser@2.2.0", "", { "dependencies": { "is-regex": "^1.0.3" } }, "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "constantinople": ["constantinople@4.0.1", "", { "dependencies": { "@babel/parser": "^7.6.0", "@babel/types": "^7.6.1" } }, "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "doctypes": ["doctypes@1.1.0", "", {}, "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "ignore-by-default": ["ignore-by-default@1.0.1", "", {}, "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="], + + "immutable": ["immutable@5.1.1", "", {}, "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-expression": ["is-expression@4.0.0", "", { "dependencies": { "acorn": "^7.1.1", "object-assign": "^4.1.1" } }, "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "js-stringify": ["js-stringify@1.0.2", "", {}, "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="], + + "jstransformer": ["jstransformer@1.0.0", "", { "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" } }, "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "nodemon": ["nodemon@3.1.9", "", { "dependencies": { "chokidar": "^3.5.2", "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^7.5.3", "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" } }, "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + + "pstree.remy": ["pstree.remy@1.1.8", "", {}, "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="], + + "pug": ["pug@3.0.3", "", { "dependencies": { "pug-code-gen": "^3.0.3", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", "pug-load": "^3.0.0", "pug-parser": "^6.0.0", "pug-runtime": "^3.0.1", "pug-strip-comments": "^2.0.0" } }, "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g=="], + + "pug-attrs": ["pug-attrs@3.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "js-stringify": "^1.0.2", "pug-runtime": "^3.0.0" } }, "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA=="], + + "pug-code-gen": ["pug-code-gen@3.0.3", "", { "dependencies": { "constantinople": "^4.0.1", "doctypes": "^1.1.0", "js-stringify": "^1.0.2", "pug-attrs": "^3.0.0", "pug-error": "^2.1.0", "pug-runtime": "^3.0.1", "void-elements": "^3.1.0", "with": "^7.0.0" } }, "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw=="], + + "pug-error": ["pug-error@2.1.0", "", {}, "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg=="], + + "pug-filters": ["pug-filters@4.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "jstransformer": "1.0.0", "pug-error": "^2.0.0", "pug-walk": "^2.0.0", "resolve": "^1.15.1" } }, "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A=="], + + "pug-lexer": ["pug-lexer@5.0.1", "", { "dependencies": { "character-parser": "^2.2.0", "is-expression": "^4.0.0", "pug-error": "^2.0.0" } }, "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w=="], + + "pug-linker": ["pug-linker@4.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "pug-walk": "^2.0.0" } }, "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw=="], + + "pug-load": ["pug-load@3.0.0", "", { "dependencies": { "object-assign": "^4.1.1", "pug-walk": "^2.0.0" } }, "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ=="], + + "pug-parser": ["pug-parser@6.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "token-stream": "1.0.0" } }, "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw=="], + + "pug-runtime": ["pug-runtime@3.0.1", "", {}, "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="], + + "pug-strip-comments": ["pug-strip-comments@2.0.0", "", { "dependencies": { "pug-error": "^2.0.0" } }, "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ=="], + + "pug-walk": ["pug-walk@2.0.0", "", {}, "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "sass": ["sass@1.86.3", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw=="], + + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "simple-update-notifier": ["simple-update-notifier@2.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "token-stream": ["token-stream@1.0.0", "", {}, "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="], + + "touch": ["touch@3.1.1", "", { "bin": { "nodetouch": "bin/nodetouch.js" } }, "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA=="], + + "undefsafe": ["undefsafe@2.0.5", "", {}, "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="], + + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "with": ["with@7.0.2", "", { "dependencies": { "@babel/parser": "^7.9.6", "@babel/types": "^7.9.6", "assert-never": "^1.2.1", "babel-walk": "3.0.0-canary-5" } }, "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w=="], + + "sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + } +} diff --git a/compile.js b/compile.js new file mode 100644 index 0000000..acebcbd --- /dev/null +++ b/compile.js @@ -0,0 +1,74 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const pug = require("pug"); +const sass = require("sass"); + +// Base directories +const srcDir = path.join(__dirname, "src"); +const viewsDir = path.join(srcDir, "views"); +const distDir = path.join(__dirname, "dist"); + +// Ensure dist directory exists +if (!fs.existsSync(distDir)) { + fs.mkdirSync(distDir, { recursive: true }); +} + +// Compile SCSS to CSS and save to dist +console.log("Compiling SCSS to CSS..."); +try { + const result = sass.compile(path.join(srcDir, "styles.scss"), { + style: "compressed", + }); + fs.writeFileSync(path.join(distDir, "styles.css"), result.css); + console.log("Successfully compiled SCSS to CSS"); +} catch (error) { + console.error("Error compiling SCSS:", error); +} + +// Define pages with their titles and taglines +const pages = [ + { + name: "index", + title: "IRC Community", + tagline: "Modern IRC community", + }, + { + name: "login", + title: "Login", + tagline: "Account Login", + }, + { + name: "register", + title: "Registration", + tagline: "Account Registration", + }, + { + name: "channels", + title: "Channels", + tagline: "IRC Channels", + }, +]; + +// Compile each page +console.log("Compiling Pug templates to HTML..."); + +for (const page of pages) { + const pugFilePath = path.join(viewsDir, `${page.name}.pug`); + const htmlOutputPath = path.join(distDir, `${page.name}.html`); + + try { + // Compile the template + const html = pug.renderFile(pugFilePath, { + title: page.title, + tagline: page.tagline, + }); + + // Write the compiled HTML to the output file + fs.writeFileSync(htmlOutputPath, html); + console.log(`Successfully compiled ${page.name}.pug to ${page.name}.html`); + } catch (error) { + console.error(`Error compiling ${page.name}.pug:`, error); + } +} + +console.log("All files compiled successfully!"); diff --git a/dist/.gitkeep b/dist/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..7109076 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "irc-sekor", + "version": "1.0.0", + "description": "IRC*Sekor - IRC Community Website", + "main": "compile.js", + "scripts": { + "build": "node compile.js", + "dev": "nodemon -e pug,scss --watch src --exec 'node compile.js'" + }, + "dependencies": { + "pug": "^3.0.3", + "sass": "^1.86.3" + }, + "devDependencies": { + "nodemon": "^3.1.9" + } +} diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..23706c8 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,391 @@ +// Variables +$primary: #4a6fa5; +$primary-dark: #385580; +$secondary: #6c5ce7; +$light: #f8f9fa; +$dark: #212529; +$success: #28a745; +$gray: #6c757d; +$gray-light: #e9ecef; + +// Base styles +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +body { + background-color: $light; + color: $dark; + line-height: 1.6; +} + +// Header styles +header { + background: linear-gradient(135deg, $primary, $secondary); + color: white; + padding: 2rem 0; + text-align: center; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + + .logo { + font-size: 2.5rem; + font-weight: bold; + margin-bottom: 1rem; + } + + .tagline { + font-size: 1.2rem; + opacity: 0.9; + } +} + +// Navigation +nav { + background-color: white; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + position: sticky; + top: 0; + z-index: 100; + + .navbar { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; + } + + .nav-brand { + font-size: 1.5rem; + font-weight: bold; + color: $primary; + text-decoration: none; + padding: 1rem 0; + } + + .nav-links { + display: flex; + list-style: none; + + li a { + display: block; + padding: 1rem; + color: $dark; + text-decoration: none; + transition: color 0.3s; + + &:hover { + color: $primary; + } + } + } +} + +// Container +.container { + max-width: 1200px; + margin: 0 auto; + padding: 2rem 1rem; +} + +// Hero section +.hero { + text-align: center; + padding: 3rem 1rem; + + h1 { + font-size: 2.5rem; + margin-bottom: 1rem; + color: $primary; + } + + p { + font-size: 1.2rem; + color: $gray; + margin-bottom: 2rem; + max-width: 800px; + margin-left: auto; + margin-right: auto; + } +} + +// Buttons +.btn { + display: inline-block; + padding: 0.8rem 1.5rem; + background-color: $primary; + color: white; + text-decoration: none; + border-radius: 4px; + font-weight: 500; + transition: background-color 0.3s, transform 0.2s; + cursor: pointer; + + &:hover { + background-color: $primary-dark; + transform: translateY(-2px); + } + + &-large { + font-size: 1.1rem; + padding: 1rem 2rem; + } +} + +// Connection methods +.connection-methods { + background-color: white; + border-radius: 8px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + padding: 2rem; + margin-bottom: 2rem; +} + +.method-card { + background-color: $gray-light; + border-radius: 8px; + padding: 1.5rem; + margin-bottom: 1rem; + transition: transform 0.3s; + + &:hover { + transform: translateY(-5px); + } + + .method-title { + font-size: 1.2rem; + color: $primary; + margin-bottom: 0.5rem; + display: flex; + align-items: center; + } + + .method-icon { + margin-right: 0.5rem; + font-size: 1.4rem; + } + + .method-details { + color: $gray; + } +} + +.connect-link { + display: inline-block; + margin-top: 0.5rem; + color: $primary; + font-weight: 500; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +// Features section +.features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin: 3rem 0; +} + +.feature-card { + background-color: white; + border-radius: 8px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + padding: 2rem; + text-align: center; + transition: transform 0.3s; + + &:hover { + transform: translateY(-10px); + } + + .feature-icon { + font-size: 2.5rem; + color: $primary; + margin-bottom: 1rem; + } + + .feature-title { + font-size: 1.5rem; + margin-bottom: 1rem; + color: $dark; + } + + .feature-text { + color: $gray; + } +} + +// Section titles +.section-title { + text-align: center; + margin: 3rem 0 2rem; + color: $primary; + font-size: 2rem; +} + +// FAQ section +.faq-item { + background-color: white; + border-radius: 8px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + margin-bottom: 1rem; + overflow: hidden; + + .faq-question { + background-color: $gray-light; + padding: 1rem; + font-weight: 500; + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + } + + .faq-answer { + padding: 1rem; + color: $gray; + } +} + +// Steps section +.steps { + counter-reset: step-counter; + margin: 2rem 0; +} + +.step { + background-color: white; + border-radius: 8px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + padding: 1.5rem; + margin-bottom: 1.5rem; + position: relative; + padding-left: 3.5rem; + + &::before { + counter-increment: step-counter; + content: counter(step-counter); + position: absolute; + left: 1rem; + top: 1.5rem; + background-color: $primary; + color: white; + width: 2rem; + height: 2rem; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + font-weight: bold; + } + + &-title { + color: $primary; + margin-bottom: 0.5rem; + font-size: 1.2rem; + } +} + +// Footer +footer { + background-color: $dark; + color: white; + padding: 3rem 0; + margin-top: 3rem; + + .footer-content { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 2rem; + } + + .footer-section { + h3 { + color: $gray-light; + margin-bottom: 1rem; + } + } + + .footer-links { + list-style: none; + + li { + margin-bottom: 0.5rem; + } + + a { + color: $gray; + text-decoration: none; + transition: color 0.3s; + + &:hover { + color: white; + } + } + } + + .copyright { + text-align: center; + padding: 1rem 0; + color: $gray; + border-top: 1px solid rgba(255, 255, 255, 0.1); + margin-top: 2rem; + } +} + +// Responsive styles +@media (max-width: 768px) { + .navbar { + flex-direction: column; + padding: 0.5rem 1rem; + } + + .nav-links { + flex-direction: column; + width: 100%; + } + + .features { + grid-template-columns: 1fr; + } +} + +// Additional utilities +.page-content { + min-height: 60vh; +} + +.code-block { + background-color: #f1f1f1; + border-radius: 4px; + padding: 0.5rem; + font-family: monospace; + overflow-x: auto; + margin: 0.5rem 0; +} + +.tip { + background-color: rgba($primary, 0.1); + border-left: 4px solid $primary; + padding: 1rem; + margin: 1rem 0; +} + +.screenshot { + max-width: 100%; + height: auto; + border-radius: 8px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); + margin: 1rem 0; +} \ No newline at end of file diff --git a/src/views/channels.pug b/src/views/channels.pug new file mode 100644 index 0000000..4cef058 --- /dev/null +++ b/src/views/channels.pug @@ -0,0 +1,99 @@ +extends layout + +block content + .container.page-content + h2.section-title Popular Channels + + p On the IRC*Sekor server, you'll find various topic channels. Below is a list of the most popular channels: + + .method-card + .method-title #main + p The main community channel, a place for casual conversations and getting to know other users. + a.connect-link(href="ircs://irc.sekor.eu.org:6697/#main") Join #main + + .method-card + .method-title #tech + p Discussions on technical topics, programming, computer hardware, and technology news. + a.connect-link(href="ircs://irc.sekor.eu.org:6697/#tech") Join #tech + + .method-card + .method-title #help + p Help channel where you can ask questions about IRC, the server, or other topics. + a.connect-link(href="ircs://irc.sekor.eu.org:6697/#help") Join #help + + .method-card + .method-title #gaming + p Everything about computer games, consoles, and e-sports. + a.connect-link(href="ircs://irc.sekor.eu.org:6697/#gaming") Join #gaming + + h2.section-title Creating Your Own Channel + + p You can also create your own channel on our IRC server. Here's how to do it: + + .steps + .step + h3.step-title Connect to the Server + p First, connect to the IRC*Sekor server using your preferred method. + + .step + h3.step-title Join a New Channel + p To create and join a new channel, use the command: + .code-block /join #YourChannelName + p Replace YourChannelName with the name you want for your channel. Channel names must start with # and should be descriptive but concise. + + .step + h3.step-title Obtain Channel Operator Status + p As the first person to join the channel, you'll automatically become a channel operator (op), giving you administrative rights. + + .step + h3.step-title Register Your Channel (Recommended) + p To maintain ownership of your channel, register it with ChanServ: + .code-block /msg ChanServ REGISTER #YourChannelName + p You need to have a registered nickname before registering a channel. + + .step + h3.step-title Configure Your Channel + p Set up channel modes and access levels for different users: + .code-block /mode #YourChannelName +t + p This example sets the +t mode, which restricts topic changes to channel operators only. + + h3 Common Channel Modes + + .method-card + .method-title Basic Channel Modes + ul + li + strong +n + | - No external messages (users must join to send messages) + li + strong +t + | - Only ops can change the topic + li + strong +s + | - Secret channel (not visible in channel listings) + li + strong +i + | - Invite-only channel + li + strong +k [password] + | - Set a channel password + li + strong +l [number] + | - Limit the number of users + + .method-card + .method-title User Privileges + ul + li + strong +o [nick] + | - Give operator status + li + strong +v [nick] + | - Give voice status (can speak in moderated channels) + li + strong +b [mask] + | - Ban a user (e.g., +b *!*@example.com) + + .tip + strong Need Help? + | If you need assistance with channel management, join #help or message a server administrator. \ No newline at end of file diff --git a/src/views/index.pug b/src/views/index.pug new file mode 100644 index 0000000..126a8fe --- /dev/null +++ b/src/views/index.pug @@ -0,0 +1,75 @@ +extends layout + +block content + .hero + h1 Welcome to IRC*Sekor Community + p Discover the classic IRC chat experience with a modern twist. Connect with others, meet new people, and join discussions on various topics. + a.btn.btn-large(href="/web/") Open Web Client + + .container + h2.section-title How to Connect? + .connection-methods + .method-card + .method-title + span.method-icon 🔒 + | TLS Connection (Recommended) + .method-details + | Secure connection with TLS encryption on port 6697 + a.connect-link(href="ircs://irc.sekor.eu.org:6697") ircs://irc.sekor.eu.org:6697 + + .method-card + .method-title + span.method-icon 🔌 + | Standard Connection + .method-details + | Classic IRC connection without encryption on port 6667 + a.connect-link(href="irc://irc.sekor.eu.org:6667") irc://irc.sekor.eu.org:6667 + + .method-card + .method-title + span.method-icon 🌐 + | WebSockets (TLS) + .method-details + | Connection through WebSockets protocol with encryption + span.connect-link wss://irc.sekor.eu.org:8097 + + .method-card + .method-title + span.method-icon 💻 + | Web Client + .method-details + | Use our built-in web client + a.connect-link(href="/web/") Open Web Client + + h2.section-title Why IRC*Sekor? + .features + .feature-card + .feature-icon 🔒 + h3.feature-title Security + p.feature-text Encrypted TLS and WebSockets connections to protect your privacy and communication security. + + .feature-card + .feature-icon ⚡ + h3.feature-title Speed + p.feature-text Lightweight IRC protocol ensures minimal latency and lightning-fast communication. + + .feature-card + .feature-icon 👥 + h3.feature-title Community + p.feature-text Diverse topic channels and friendly atmosphere for all users. + + h2.section-title Frequently Asked Questions + .faq-item + .faq-question What is IRC? + .faq-answer + | IRC (Internet Relay Chat) is an internet communication protocol that enables real-time text conversations. It was created in 1988 and remains a popular method for online group communication. + + .faq-item + .faq-question Do I need an account to use IRC*Sekor? + .faq-answer + | No, you can use IRC*Sekor without registration. However, registering an account allows you to keep your username (nick) and access additional features. + + .faq-item + .faq-question What IRC clients can I use? + .faq-answer + | You can use any IRC client such as HexChat, mIRC, WeeChat, irssi, KiwiIRC, and many others. We also offer a built-in web client that requires no installation. \ No newline at end of file diff --git a/src/views/layout.pug b/src/views/layout.pug new file mode 100644 index 0000000..986e006 --- /dev/null +++ b/src/views/layout.pug @@ -0,0 +1,61 @@ +doctype html +html(lang="en") + head + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1.0") + title #{title} | IRC*Sekor + link(rel="stylesheet", href="styles.css") + body + header + .logo IRC*Sekor + .tagline #{tagline} + + nav + .navbar + a.nav-brand(href="index.html") IRC*Sekor + ul.nav-links + li + a(href="index.html") Home + li + a(href="register.html") Registration + li + a(href="login.html") Login + li + a(href="channels.html") Channels + li + a(href="faq.html") FAQ + + block content + + footer + .footer-content + .footer-section + h3 IRC*Sekor + p Your modern IRC community where classic chat meets contemporary technology. + + .footer-section + h3 Quick Links + ul.footer-links + li + a(href="index.html") Home + li + a(href="register.html") Registration + li + a(href="login.html") Login + li + a(href="channels.html") Channels + li + a(href="faq.html") FAQ + + .footer-section + h3 Connect + ul.footer-links + li + a(href="ircs://irc.sekor.eu.org:6697") TLS (6697) + li + a(href="irc://irc.sekor.eu.org:6667") Standard (6667) + li + a(href="/web/") Web Client + + .copyright + | © 2025 IRC*Sekor. All rights reserved. \ No newline at end of file diff --git a/src/views/login.pug b/src/views/login.pug new file mode 100644 index 0000000..87361bc --- /dev/null +++ b/src/views/login.pug @@ -0,0 +1,64 @@ +extends layout + +block content + .container.page-content + h2.section-title How to Log In to Your Account + + p If you already have a registered account on IRC*Sekor, here's how you can log in each time you connect. + + .steps + .step + h3.step-title Connect to the Server + p Connect to the IRC*Sekor server using your preferred method: + ul + li + | Using an IRC client: + span.code-block ircs://irc.sekor.eu.org:6697 + li + | Or use the + a(href="/web/") web client + + .step + h3.step-title Set Your Registered Username + p If you don't already have your username set, use the command: + .code-block /nick YourUsername + + .step + h3.step-title Log In (Identify) + p Identify yourself to the NickServ service using the command: + .code-block /msg NickServ IDENTIFY YourPassword + p or alternatively: + .code-block /ns identify YourPassword + + .step + h3.step-title Login Verification + p After logging in successfully, you'll receive confirmation from NickServ. Your nick will now be protected, and you'll have access to all your settings and channels. + + h3 Automatic Login + + p Most IRC clients allow you to configure automatic login after connecting: + + .method-card + .method-title HexChat + ol + li Open the network list (Ctrl+S) + li Select IRC*Sekor network and click "Edit" + li Enter your username in the "Nick" field + li In the "Login method" section, select "NickServ" or "SASL" + li Enter your password + + .method-card + .method-title mIRC + ol + li Open the connections window (Alt+E) + li Add or select IRC*Sekor + li In the "Connect" tab, enter your nick and username + li In the "Perform" section, add the line: /msg NickServ IDENTIFY YourPassword + + .method-card + .method-title Web Client + p In our web client, you can save your login credentials in the settings. After opening the client, click the gear icon and configure automatic login. + + .tip + strong Security: + | If you're using a shared computer, don't enable automatic login. Always log out of the client after ending your session. \ No newline at end of file diff --git a/src/views/register.pug b/src/views/register.pug new file mode 100644 index 0000000..f99ea25 --- /dev/null +++ b/src/views/register.pug @@ -0,0 +1,47 @@ +extends layout + +block content + .container.page-content + h2.section-title How to Register an Account + + p Registering an account on the IRC*Sekor server allows you to keep your username (nick) and access additional features. Below you'll find step-by-step instructions on how to do this. + + .steps + .step + h3.step-title Connect to the Server + p First, connect to the IRC*Sekor server using your preferred connection method: + ul + li + | Using an IRC client: + span.code-block ircs://irc.sekor.eu.org:6697 + li + | Or use the + a(href="/web/") web client + + .step + h3.step-title Choose a Username (Nick) + p After connecting, set your username using the command: + .code-block /nick YourUsername + + .step + h3.step-title Register Your Username + p Use the NickServ service to register your chosen nick: + .code-block /msg NickServ REGISTER YourPassword YourEmail@domain.com + .tip + strong Tip: + | Use a strong, unique password and provide a valid email address to recover your password if needed. + + .step + h3.step-title Confirm Registration + p Check your email and find the verification instructions. You'll usually need to execute a command similar to: + .code-block /msg NickServ VERIFY REGISTER YourUsername VerificationCode + + .step + h3.step-title Future Logins + p For future connections, you'll need to identify yourself: + .code-block /msg NickServ IDENTIFY YourPassword + p You can also set up your IRC client to automatically execute this command upon connecting. + + .tip + strong Note: + | Remember that if you don't use the server for an extended period (usually 30-90 days), your registered name may be removed. Log in regularly to maintain your registration. \ No newline at end of file