This commit is contained in:
Flummi 2020-04-02 04:35:28 +02:00
parent 5ff96cdf5e
commit d39deeb038
100 changed files with 34498 additions and 1100 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
node_modules/
logs/
config.json
public/b/*
public/t/*

160
package-lock.json generated
View File

@ -4,19 +4,66 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/geojson": {
"version": "7946.0.7",
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
"integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ=="
},
"@types/node": {
"version": "13.9.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.8.tgz",
"integrity": "sha512-1WgO8hsyHynlx7nhP1kr0OFzsgKz5XDQL+Lfc3b1Q3qIln/n8cKD4m09NJ0+P1Rq7Zgnc7N0+SsMnoD1rEb0kA=="
},
"amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
},
"async": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
},
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
},
"cuffeo": {
"version": "git+https://gitfap.de/keinBot/cuffeo.git#d55586ce5520d4119fa0900ef15ce8736fc62364",
"from": "git+https://gitfap.de/keinBot/cuffeo.git"
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cuffeo/-/cuffeo-1.0.6.tgz",
"integrity": "sha512-TdrkkDM4uR/iTEtazfxbmLUXoNB3NLC/RMgpWVUQC8j2uOiaLl7U7agdLdxfJq4uEt56cJUftqH9Tb3BofslNg==",
"requires": {
"flumm-fetch-cookies": "^1.3.5"
}
},
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
"denque": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
},
"flumm-fetch": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/flumm-fetch/-/flumm-fetch-1.0.1.tgz",
"integrity": "sha512-pZ5U0hheCSW43vfGZQMunr03U7rUOX+iy2y13Tu4nc3iRL+E/Qfeo5nZ2B2JMYKOGIx1A1anUYOz+ulyhouyjg=="
},
"flumm-fetch-cookies": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/flumm-fetch-cookies/-/flumm-fetch-cookies-1.3.5.tgz",
"integrity": "sha512-jFLVgwD2eV2jvlbil1E+2dPeR6s07BdXJ1xRRAoq9OU87fALXbKGBa3vZO0zaWyVXEukgE0z/cMoyFsNNZUdTQ==",
"requires": {
"flumm-fetch": "^1.0.1"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz",
"integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
@ -27,19 +74,110 @@
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
},
"mariadb": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.0.3.tgz",
"integrity": "sha512-/0poOq++rcAWrSHdS+ozLDbK+/ZOpQ2XHYoVHXeZtMuhxEH/w7g/KfwryCqr3BCIC0JC/9UeJJG3v7vNNlshag==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.3.1.tgz",
"integrity": "sha512-suv+ygoiS+tQSKmxgzJsGV9R+USN8g6Ql+GuMo9k7alD6FxOT/lwebLHy63/7yPZfVtlyAitK1tPd7ZoFhN/Sg==",
"requires": {
"denque": "^1.4.0",
"iconv-lite": "^0.4.24",
"long": "^4.0.0"
"@types/geojson": "^7946.0.7",
"@types/node": ">=8.0.0",
"denque": "^1.4.1",
"iconv-lite": "^0.5.1",
"long": "^4.0.0",
"moment-timezone": "^0.5.27"
}
},
"minimist": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
},
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
},
"moment-timezone": {
"version": "0.5.28",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz",
"integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==",
"requires": {
"moment": ">= 2.9.0"
}
},
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
"requires": {
"minimist": "~0.0.1",
"wordwrap": "~0.0.2"
}
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"source-map": {
"version": "0.1.34",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
"integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
"requires": {
"amdefine": ">=0.0.4"
}
},
"swig": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz",
"integrity": "sha1-QIXKBFM2kQS11IPihBs5t64aq6U=",
"requires": {
"optimist": "~0.6",
"uglify-js": "~2.4"
}
},
"uglify-js": {
"version": "2.4.24",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz",
"integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=",
"requires": {
"async": "~0.2.6",
"source-map": "0.1.34",
"uglify-to-browserify": "~1.0.0",
"yargs": "~3.5.4"
}
},
"uglify-to-browserify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc="
},
"window-size": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
},
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
},
"yargs": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz",
"integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=",
"requires": {
"camelcase": "^1.0.2",
"decamelize": "^1.0.0",
"window-size": "0.1.0",
"wordwrap": "0.0.2"
},
"dependencies": {
"wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
}
}
}
}
}

View File

@ -4,14 +4,14 @@
"description": "f0ck, kennste?",
"main": "index.mjs",
"scripts": {
"start": "npm run minify && node --experimental-modules src/",
"debug": "cp public/js/f0ck.js public/js/f0ck.min.js && node --experimental-modules src/",
"minify": "/usr/bin/uglifyjs public/js/f0ck.js -c -m --ecma 8 --warn -o public/js/f0ck.min.js"
"start": "node --experimental-json-modules --harmony-optional-chaining src/index.mjs"
},
"author": "Flummi",
"license": "MIT",
"dependencies": {
"cuffeo": "git+https://gitfap.de/keinBot/cuffeo.git",
"mariadb": "^2.0.3"
"cuffeo": "^1.0.6-1",
"flumm-fetch-cookies": "^1.3.5",
"mariadb": "^2.3.1",
"swig": "^1.4.2"
}
}

Binary file not shown.

View File

@ -1,187 +0,0 @@
@font-face {
font-family: "Cyberfall";
src:url(https://f0ck.it/uploads/Cyberfall.otf) format("opentype");
src: url("/css/Cyberfall.woff2") format("woff")
}
/*Theming*/
:root {
--primary-color: #302AE6;
--secondary-color: #536390;
--font-color: #424242;
--bg-color: #090f13;
--heading-color: #292922;
}
[data-theme="light"] {
--primary-color: #9A97F3;
--secondary-color: #818cab;
--font-color: #e1e1ff;
--bg-color: black;
--heading-color: #818cab;
}
/*End of Theming*/
html, body {
height: 100%;
width: 100%;
margin: 0;
overflow: hidden;
background-color: var(--bg-color);
color: var(--font-color);
}
div.pageWrapper {
height: 100%;
width: 100%;
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 0.2fr 2.6fr 0fr;
}
div#header, div#footer {
z-index: 9999;
background-color: #292922;
}
#header {
display: grid;
grid-template-columns: 1fr 6fr 1fr;
grid-gap: 0;
}
#logoHead {
margin: 6px 0 0 4px;
padding: 0;
font-size: 14px;
}
#logo {
padding: 1px 4px 1px 4px;
height: 48px;
}
#itemInfo {
display: none;
height: 61px;
position: absolute;
left: 200px;
right: 270px;
top: 4px;
}
#itemInfo div.infoText {
margin-top: 3px;
}
#pagePosition, #itemPosition {
position: absolute;
right: 8px;
top: 6px;
padding: 0;
color: #7d7b6a;
background-color: #333;
}
#pagePosition span, #itemPosition span {
color: #9d9b8a;
}
/*#pagePosition {
display: block;
}
#itemPosition {
display: none;
}*/
div#content {
position: relative;
}
div.wrapper {
display: none;
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
div#howtowrapper {
overflow: hidden;
background-color: rgba(0, 0, 0, 0.9);
z-index: 999;
}
#itemInfo {
position: absolute;
background: #191b1b;
border-bottom-right-radius: 5px;
color: aliceblue;
padding: 5px;
left: auto;
right: auto;
top: auto;
border-right: 1px solid white;
border-bottom: 1px solid white;
}
#logoHead {
margin: 10px;
}
div#header, div#footer {
z-index: 9999;
background-color: #23232199;
box-shadow: 2px 2px 2px black;
border-bottom: 1px solid white;
}
#itemSource {
color: #04c33e;
position: relative;
top: -3px;
text-shadow: 1px 1px 1px black;
}
#itemInfo {
position: unset;
background: #191b1b;
color: aliceblue;
padding: 5px;
left: auto;
right: auto;
top: auto;
grid-row-start: 0;
border: 0;
}
#itemPosition {
display: block;
grid-row-start: -1;
position: absolute;
color: lime;
text-shadow: 1px 1px black;
font-family: monospace;
}
#itemInfo {
position: unset;
background: #191b1b;
color: aliceblue;
padding: 5px;
left: auto;
right: auto;
top: auto;
height: auto;
text-align: center;
}
.infoText {
font-family: monospace;
}
div#itemPosition {
font-family: Cyberfall;
font-size: 290%;
background: transparent;
text-align: right;
padding-right: 5px;
text-shadow: 0px 0px 8px #04c33e;
}

View File

@ -1,91 +0,0 @@
div.close {
position: fixed;
cursor: pointer;
height: 48px;
width: 48px;
opacity: .5;
border-radius: 10px;
z-index: 90;
top: 80px;
right: 10px;
}
div.close:hover {
opacity: .9;
box-shadow: 0px 0px 0px 2px #dac8d2;
border-radius: 10px;
transition: .1s ease-in;
}
div.close:before {
content: '';
clip-path: polygon(20% 0%, 0% 20%, 30% 50%, 0% 80%, 20% 100%, 50% 70%, 80% 100%, 100% 80%, 70% 50%, 100% 20%, 80% 0%, 50% 30%);
position: absolute;
top: 7%;
right: 7%;
height: 41px;
width: 41px;
background-color: rgba(255, 255, 255, .5);
}
div.arrow {
position: absolute;
cursor: pointer;
height: 70px;
width: 70px;
background-color: #000;
opacity: .5;
border-radius: 10px;
z-index: 90;
}
div.arrow:hover {
opacity: .9;
box-shadow: 0px 0px 0px 2px #dac8d2;
border-radius: 10px;
transition: .1s ease-in;
}
div.arrow:before {
content: '';
position: absolute;
top: 7%;
left: 7%;
height: 60px;
width: 60px;
background-color: rgba(255, 255, 255, 0.5);
}
div.top:before {
clip-path: polygon(0% 77%, 50% 23%, 100% 77%);
}
div.bottom:before {
clip-path: polygon(0% 23%, 100% 23%, 50% 77%);
}
div.left:before {
clip-path: polygon(23% 50%, 77% 0%, 77% 100%);
}
div.right:before {
clip-path: polygon(23% 0%, 77% 50%, 23% 100%);
}
div.arrow.top {
top: 10px;
left: 50%;
transform: translateX(-50%);
}
div.arrow.bottom {
bottom: 10px;
left: 50%;
transform: translateX(-50%);
}
div.arrow.left {
position: fixed !important;
left: 10px;
top: 50%;
transform: translateY(-50%);
}
div.arrow.right {
position: fixed !important;
right: 10px;
top: 50%;
transform: translateY(-50%);
}

View File

@ -1,31 +0,0 @@
div#itemwrapper {
overflow: hidden;
background-color: rgba(0, 0, 0, 0.4);
z-index: 999;
}
div#i_items {
width: 300%;
height: 100%;
overflow: hidden;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 1fr;
grid-template-areas: ". . .";
}
div.i_item {
overflow: hidden;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.item {
max-height: 100%;
max-width: 100%;
}
.item:hover {
background-color: rgba(0, 0, 0, 0.8);
}

View File

@ -1,33 +0,0 @@
div#pagewrapper {
display: block;
overflow: hidden;
}
div#p_items {
overflow: hidden;
height: 100%;
width: 100%;
}
div.p_item {
height: 100%;
}
div.p_item > a {
width: 128px;
height: 128px;
box-shadow: 2px 2px 6px 0px rgb(0, 0, 0);
margin: 4px;
float: left;
outline: none;
box-shadow: inset 0 0 10px #4c4a4a;
}
div.p_item > a > img.thumb {
border: 2px solid black;
transition: .1s ease-out;
}
div.p_item > a > img.thumb:hover {
box-shadow: 0px 0px 0px 2px #dac8d2;
border-radius: 5px;
transition: .1s ease-in;
}

Binary file not shown.

View File

@ -1,47 +0,0 @@
Shareware/ Font License
Pixel Sagas Freeware Fonts EULA (End User License Agreement) and Software Inclusion Agreement
"Purchaser" and "User" may be used interchangeably in this agreement.
"Pixel Sagas" and "Neale Davidson" may be used interchangeably in this agreement. These all refer to the intellectual and legal property of Neale Davidson.
Usage
Pixel Saga's Shareware Fonts are free to use for personal, non-commercial purposes. No payment is necessary to use Pixel Saga's Freeware Fonts for personal use, and there is no limit to the amount of prints, pages, or other medium to be produced using them. However, you cannot offer the font for commercial sale, or offer for direct download. The inclusion othe font name and/or site URL in the credits or documentation when it is used is appreciated, but this is not mandatory.
Payment
Payment is not required for the use of Pixel Saga's Shareware Fonts. Commercial use requires a modest fee which can be paid through the pixelsagas.com web site through Paypal.com's services. The transaction receipt for any shareware "commercial license" purchase will suffice as proof of license.
Support
Font installation help is available at http://www.pixelsagas.com. If you experience problems with any Pixel Saga's Freeware font (such as spacing issues or missing characters), please verify that you have the correct and current version of the fonts. In the case of Freeware fonts, downloading the font directly from the Pixel Sagas site will ensure that the font files have not been altered.
Software Inclusion Agreement
Pixel Saga's software products are protected by copyright laws and International copyright treaties, as well as other intellectual property laws and treaties. All Pixel Saga's software products are licensed, not sold.
1) GRANT OF LICENSE
This document grants the user the following rights:
Installation and Use. The user may install and use an unlimited number of copies of the software product. The user may not offer Pixel Sagas freeware fonts for direct download unless the user has received explicit, written permission from Neale Davidson. Otherwise please direct users to the http://www.pixelsagas.com website. Pixel Sagas freeware fonts may, however, be embedded for web, publication, or general software use.
2) WARRANTIES
None
Pixel Sagas expressly disclaims any warranty for the software product. The software product and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the software product remains with the user.
No Liability For Consequential Damages.
In no event shall Neale Davidson or Pixel Sagas be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if Pixel Sagas has been advised of the possibility of such damages.
3) MISCELLANEOUS
Should the user have any questions concerning this document or you desire to contact Neale Davidson for any reason, please email jaynz@pixelsagas.com .
Governing Law
This agreement is governed by and subject to the laws of the United States of America.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 KiB

View File

@ -1,180 +0,0 @@
import rt from "./rt.js";
import lib from "./lib.js";
const events = {};
events.wheel = async e => {
if(rt.tmp.events.page) { // Pageevents
if(rt.tmp.scroll)
return;
const deltaY = e.target.id === "up" ? -1 : e.deltaY < 0 ? -1: 1; // -1 up, 1 down
if((deltaY === -1 && rt.items.first === rt.items.newest) || (deltaY === 1 && rt.items.last === rt.items.oldest))
return rt.tmp.scroll = false;
rt.tmp.scroll = true;
rt.items.eps = 0;
await lib.getItems({
el: rt.ct.wrapper.pages[deltaY === -1 ? 0 : 2],
opt: deltaY === -1 ? `id=${rt.items.first}&order=asc` : `id=${rt.items.last}&order=desc`
});
rt.ct.wrapper.pages[deltaY === -1 ? 0 : 2].scrollIntoView({ block: rt.vars.block, behavior: "smooth" });
await new Promise(resolve => setTimeout(resolve, rt.vars.cd));
document.querySelector("div#p_items").removeChild(rt.ct.wrapper.pages[deltaY === -1 ? 2 : 0]);
const newdiv = document.createElement("div");
newdiv.classList.add("p_item");
document.querySelector("div#p_items").insertAdjacentElement((deltaY === -1 ? "afterbegin" : "beforeend"), newdiv);
rt.ct.wrapper.pages = document.querySelectorAll("div.p_item");
lib.calcItems();
lib.scrolltomiddle(rt.ct.wrapper.pages);
rt.ct.wrapper.pages[0].innerHTML = "";
rt.ct.wrapper.pages[2].innerHTML = "";
}
if(rt.tmp.events.item) { // Itemevents
if(rt.tmp.scroll)
return;
const deltaY = e.target.id === "left" ? -1 : e.deltaY < 0 ? -1: 1; // -1 left, 1 right
if((deltaY === -1 && rt.items.act === rt.items.oldest) || (deltaY === 1 && rt.items.act === rt.items.newest))
return;
window.location = `${window.location.pathname}#${deltaY === -1 ? rt.items.next : rt.items.prev}`;
}
rt.tmp.scroll = false;
};
events.resize = async e => {
e.preventDefault();
clearTimeout(rt.tmp.resize);
lib.calcItems();
rt.tmp.resize = setTimeout(() => lib.getItems({
el: rt.ct.wrapper.pages[1],
opt: `id=${rt.items.first + 1}&order=desc`
}), rt.vars.cd);
lib.scrolltomiddle(rt.ct.wrapper.pages);
if(rt.tmp.events.item) {
lib.scrolltomiddle(rt.ct.wrapper.items);
}
};
events.volumechange = e => {
localStorage.setItem("volume", e.target.volume);
};
events.hashchange = async e => {
if(rt.tmp.scroll || !rt.tmp.hash)
return rt.tmp.hash = true;
rt.tmp.scroll = true;
console.log("hashchange lol");
if(rt.tmp.layer !== "item")
rt.ct.wrapper.items[1].innerHTML = "";
const itemid = parseInt((e.newURL?e.newURL:e.detail.newURL).split("#").slice(-1));
if(!itemid || itemid <= 0) // failover oder so
return lib.closeItemview();
const next = rt.items.act === null || rt.items.act === itemid ? 1 : rt.items.act > itemid ? 2 : 0;
lib.showLayer("item", next === 1);
rt.ct.header.itempos.innerHTML = `${itemid}`;
const item = await lib.getItem(itemid);
item.dest = item.dest.replace(/^\./, "");
rt.ct.header.infos.source.href = item.src;
rt.ct.header.infos.source.innerHTML = item.srchost;
rt.ct.header.infos.channel.innerHTML = `${item.usernetwork} ${item.userchannel}`;
rt.ct.header.infos.title.innerHTML = `${item.mime} (${item.size})`;
rt.ct.header.infos.nick.innerHTML = item.username;
// <test>
if(itemid > rt.items.first || itemid < rt.items.last) { // Scroll to next Page
rt.items.eps = 0;
await lib.getItems({
el: rt.ct.wrapper.pages[1],
opt: next === 0 ? `id=${itemid-1}&order=asc` : `id=${itemid+1}&order=desc`
});
/*rt.tmp.scroll = false;
events.wheel.page({
target: {
id: next === 0 ? "up" : "down"
}
});
rt.tmp.scroll = true;*/
}
// </test>
rt.ct.wrapper.pages[1].querySelectorAll("a > img").forEach(f => {
f.style.boxShadow = null;
f.style.borderRadius = null;
f.style.transition = ".1s ease-out";
});
setTimeout(() => {
rt.ct.wrapper.pages[1].querySelector(`a[href='#${itemid}'] > img`).style.boxShadow = "0px 0px 0px 2px #dac8d2";
rt.ct.wrapper.pages[1].querySelector(`a[href='#${itemid}'] > img`).style.borderRadius = "5px";
rt.ct.wrapper.pages[1].querySelector(`a[href='#${itemid}'] > img`).style.transition = ".1s ease-in";
}, 50);
let el;
switch(item.mime) {
case "audio/flac":
case "audio/mpeg":
case "audio/ogg":
case "audio/x-flac": // audios
el = document.createElement("audio");
el.src = `${rt.url}${item.dest}`;
el.type = item.mime;
el.autoplay = true;
el.controls = true;
el.loop = true;
el.volume = localStorage.getItem("volume") || 1;
el.addEventListener("volumechange", ev => events.volumechange(ev));
break;
case "image/gif":
case "image/jpeg":
case "image/png": // images
el = document.createElement("img");
el.src = `${rt.url}${item.dest}`;
break;
case "video/mp4":
case "video/quicktime":
case "video/webm":
case "video/ogv": // videos
el = document.createElement("video");
el.src = `${rt.url}${item.dest}`;
el.type = item.mime;
el.autoplay = true;
el.controls = true;
el.loop = true;
el.volume = localStorage.getItem("volume") || 1;
el.addEventListener("volumechange", ev => events.volumechange(ev));
break;
default:
alert("lol hacker");
break;
}
el.classList.add("item");
rt.ct.wrapper.items[next].insertAdjacentElement("afterbegin", el);
rt.ct.wrapper.items[next].scrollIntoView({ block: rt.vars.block, behavior: "smooth" });
rt.items.prev = item.prev;
rt.items.next = item.next;
rt.items.act = item.id;
await new Promise(resolve => setTimeout(resolve, rt.vars.cd));
if(next !== 1) {
document.querySelector("div#i_items").removeChild(rt.ct.wrapper.items[next === 0 ? 2 : 0]);
const newdiv = document.createElement("div");
newdiv.classList.add("i_item");
document.querySelector("div#i_items").insertAdjacentElement((next === 0 ? "afterbegin" : "beforeend"), newdiv);
rt.ct.wrapper.items = document.querySelectorAll("div.i_item");
}
lib.scrolltomiddle(rt.ct.wrapper.items);
rt.ct.wrapper.items[0].innerHTML = "";
rt.ct.wrapper.items[2].innerHTML = "";
rt.tmp.scroll = false;
};
export default events;

View File

@ -1,41 +0,0 @@
import rt from "./rt.js";
import events from "./events.js";
import lib from "./lib.js";
if(rt.debug) {
window.d = {
rt: rt,
events: events,
lib: lib
};
}
(async () => {
lib.showLayer("page");
window.addEventListener("hashchange", events.hashchange);
document.addEventListener("wheel", events.wheel);
window.addEventListener("resize", events.resize);
[...rt.ct.arrows] // add pagebuttons
.forEach(p => p.addEventListener("click", events.wheel));
const debug = document.querySelectorAll("span#debug > a");
debug[0].addEventListener("click", async () => { // random
const random = await (await fetch(`${rt.api}/random`)).json();
window.location = `${window.location.pathname}#${random.id}`;
});
setTimeout(() => {
const pn = parseInt(document.location.pathname.split("/").splice(-1));
const hash = document.location.hash;
if(!hash) {
lib.getItems({
el: rt.ct.wrapper.pages[1],
opt: pn > 0 ? `id=${pn + 1}&order=desc` : ""
});
lib.scrolltomiddle(rt.ct.wrapper.pages);
}
else
window.dispatchEvent(new CustomEvent("hashchange", { detail: { newURL: hash } }));
}, 300);
})();

View File

@ -1 +0,0 @@
import rt from"./rt.js";import events from"./events.js";import lib from"./lib.js";rt.debug&&(window.d={rt,events,lib}),(async()=>{lib.showLayer("page"),window.addEventListener("hashchange",events.hashchange),document.addEventListener("wheel",events.wheel),window.addEventListener("resize",events.resize),[...rt.ct.arrows].forEach(e=>e.addEventListener("click",events.wheel)),document.querySelectorAll("span#debug > a")[0].addEventListener("click",async()=>{const e=await(await fetch(`${rt.api}/random`)).json();window.location=`${window.location.pathname}#${e.id}`}),setTimeout(()=>{const e=parseInt(document.location.pathname.split("/").splice(-1)),t=document.location.hash;t?window.dispatchEvent(new CustomEvent("hashchange",{detail:{newURL:t}})):(lib.getItems({el:rt.ct.wrapper.pages[1],opt:e>0?`id=${e+1}&order=desc`:""}),lib.scrolltomiddle(rt.ct.wrapper.pages))},300)})();

View File

@ -1,128 +0,0 @@
import rt from "./rt.js";
import events from "./events.js";
const calcItems = () => {
const cs = window.getComputedStyle(rt.ct.content);
const height = parseInt(cs.height.replace("px", ""));
const width = parseInt(cs.width.replace("px", ""));
const cols = ~~(width / ( rt.layout.itemsize + rt.layout.margin ));
const rows = ~~(height / ( rt.layout.itemsize + rt.layout.margin ));
rt.ct.wrapper.pages.forEach(e => {
e.style.marginLeft = Math.max((width - (cols * (rt.layout.itemsize + rt.layout.margin)) + rt.layout.margin) / rt.layout.min_rows, 0) * 1.5 + "px";
e.style.paddingTop = Math.max((height - (rows * (rt.layout.itemsize + rt.layout.margin)) + rt.layout.margin) / rt.layout.min_rows, 0) * 3 + "px";
});
return {
rows: rows,
cols: cols,
eps: rows * cols,
width: width,
height: height
};
};
const getItems = async ({ el, opt = "" }) => {
const tmp = calcItems();
if(tmp.eps === rt.items.eps)
return;
rt.items.eps = tmp.eps;
el.innerHTML = "";
const i = await (await fetch(`${rt.api}/p?eps=${tmp.eps}&${opt}`)).json();
const items = i.items.sort((a, b) => b.id - a.id);
items.forEach(item => {
const _a = document.createElement("a");
_a.title = item.mime;
_a.href = `#${item.id}`;//`${rt.url}/${item.id}`;
const _img = document.createElement("img");
_img.classList.add("thumb");
_img.src = `${rt.url}/t/${item.id}.png`;
_a.insertAdjacentElement("afterbegin", _img);
el.insertAdjacentElement("beforeend", _a);
});
rt.items.first = items[0].id;
rt.items.last = items[items.length - 1].id;
rt.items.oldest = i.oldest;
rt.items.newest = i.newest;
rt.tmp.hash = false;
window.history.pushState(rt.items.first, `f0ck.me! page ${rt.items.first}`, `/page/${rt.items.first}${(window.location.hash?window.location.hash:"")}`);
rt.tmp.hash = true;
rt.ct.header.pagepos.innerHTML = `items ${rt.items.first} - ${rt.items.last}`;
};
const getItem = async itemid => {
return await (await fetch(`${rt.api}/item/${itemid}`)).json();
};
const scrolltomiddle = el => {
el[0].scrollIntoView({ block: rt.vars.block });
el[2].scrollIntoView({ block: rt.vars.block });
el[1].scrollIntoView({ block: rt.vars.block });
};
const closeItemview = () => {
rt.tmp.hash = false;
window.location.hash = "";
rt.ct.tabs.item.removeEventListener("click", closeItemview);
rt.ct.wrapper.pages[1].querySelectorAll("a > img").forEach(f => {
f.style.boxShadow = null;
f.style.borderRadius = null;
f.style.transition = ".1s ease-out";
});
rt.ct.wrapper.items[1].innerHTML = "";
showLayer("page", true);
};
const showLayer = (layer, scroll = true) => {
// hide all pages
console.log(layer, rt.tmp.layer);
if(layer === rt.tmp.layer)
return;
rt.tmp.layer = layer;
for(let e in rt.ct.tabs)
rt.ct.tabs[e].style.display = "none";
rt.tmp.events.page = false;
rt.tmp.events.item = false;
switch(layer) {
case "page":
rt.tmp.events.page = true;
if(scroll)
scrolltomiddle(rt.ct.wrapper.pages);
rt.ct.header.pagepos.style.display = "block";
rt.ct.header.itempos.style.display = "none";
rt.ct.header.iteminfo.style.display = "none";
break;
case "item":
rt.ct.tabs.item.style.display = "block";
rt.tmp.events.item = true;
rt.ct.tabs.item.addEventListener("click", closeItemview);
if(scroll)
scrolltomiddle(rt.ct.wrapper.items);
rt.ct.header.pagepos.style.display = "none";
rt.ct.header.itempos.style.display = "block";
rt.ct.header.iteminfo.style.display = "block";
break;
case "howto":
rt.ct.tabs.howto.style.display = "block";
break;
}
rt.tmp.scroll = false;
};
export default { // oof
calcItems: calcItems,
getItems: getItems,
getItem: getItem,
showLayer: showLayer,
scrolltomiddle: scrolltomiddle,
closeItemview: closeItemview
};

View File

@ -1,63 +0,0 @@
export default {
debug: true,
layout: {
margin: 6,
min_cols: 3,
min_rows: 4,
itemsize: 130
},
url: "//f0ck.me",
api: "//dev.f0ck.me/api",
vars: {
cd: 600,
block: "center"
},
tmp: {
layer: null,
_scroll: false,
get scroll() { console.log("get scroll"); return this._scroll; },
set scroll(val) { console.log("set scroll: " + val); this._scroll = val; },
events: {
page: true,
item: false
},
resize: null,
_hash: true,
get hash() { console.log("get hash"); return this._hash; },
set hash(val) { console.log("set hash: " + val); this._hash = val; }
},
items: {
first: null,
last: null,
newest: null,
oldest: null,
next: null,
prev: null,
act: null,
eps: 0
},
ct: {
content: document.querySelector("div#content"),
wrapper: {
pages: document.querySelectorAll("div.p_item"),
items: document.querySelectorAll("div.i_item")
},
tabs: {
item: document.querySelector("div#itemwrapper"),
howto: document.querySelector("div#howtowrapper")
},
arrows: document.querySelectorAll("div.arrow"),
header: {
iteminfo: document.querySelector("div#itemInfo"),
pagepos: document.querySelector("div#pagePosition"),
itempos: document.querySelector("div#itemPosition"),
infos: {
title: document.querySelector("span#itemTitle"),
source: document.querySelector("a#itemSource"),
time: document.querySelector("span#itemTime"),
nick: document.querySelector("span#itemNick"),
channel: document.querySelector("span#itemChannel")
}
}
}
};

BIN
public/s/95.ttf Normal file

Binary file not shown.

10224
public/s/css/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load Diff

10832
public/s/css/bulma.css vendored Normal file

File diff suppressed because it is too large Load Diff

23
public/s/css/classic.css Normal file
View File

@ -0,0 +1,23 @@
/* This is the classic style f0ck */
.mudderfigg {
display: flex;
flex-flow: column;
}
span.id {
background: unset;
text-align: left;
color: #ffffff;
border: unset;
}
.id > a {
color: #9f0;
}
.options {
padding-left: 15px;
margin-top: -5px;
padding-bottom: 15px;
}

178
public/s/css/coldblue.css Normal file
View File

@ -0,0 +1,178 @@
@font-face {
font-family: "Cyberfall";
src: url(https://dr0p.it/Clgl.otf) format("opentype");
}
body {
margin: 0em auto 3em auto;
background-color: #0B111D;
color: #fff;
font-family: "Cyberfall";
font-size: 12px;
}
a {
color: #00ffed;
}
a:hover {
color: #00b4ef;
}
.return {
text-align: center;
border-bottom: 2px solid #154d71;
width: 100%;
margin: 0 auto;
background: #121323;
top: 0;
}
.controls {
text-align: center;
color: #00ffed;
width: 888px;
margin: 0 auto;
background: #121323;
padding-top: 0;
margin-top: 35px;
border: 2px solid #154d71;
}
.navbar {
margin: 0 auto;
width: 100%;
border: 0;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
position: fixed;
overflow: visible;
z-index: 999;
background-color: #0b111d;
border-bottom: 2px solid #207ea4;
text-align: center;
top: 0;
}
.medium, .thumbnail {
display: flex;
justify-content: center;
margin-top: 5px;
background: #121323;
border: 2px solid #154d71;
padding: 5px;
}
.panel {
margin-bottom: 0;
background-color: rgb(18, 19, 35);
border: 2px solid #154D71;
border-radius: 0px;
padding-left: 10px;
padding-right: 10px;
width: 25%;
position: relative;
min-height: 1px;
}
input, select, textarea {
border: 1px double #00edff;
background: #282A2E;
color: #f1e3ce;
font-family: 'Hack', monospace, sans-serif;
font-size: 80%;
}
.thumb {
border: 2px solid #207ea4;
}
.plyr--video .plyr__controls {
position: absolute;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
padding: 0px 0px 0px;
background: rgb(11, 17, 29);
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
color: #00edff;
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
}
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #0b111d;
color: #00edff;
border-radius: 0;
}
.plyr__progress--played, .plyr__volume--display {
z-index: 1;
color: #00edff;
background: 0 0;
transition: none;
}
.plyr input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
margin-top: -4px;
position: relative;
height: 16px;
width: 16px;
background: #0b111d;
border: 1px solid #00edff;
border-radius: 100%;
transition: background .2s ease,border .2s ease,transform .2s ease;
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-webkit-slider-thumb {
background: #0b111d;
border-color: #00edff;
transform: scale(1.25)
}
/* Feuerfick */
.plyr input[type="range"]::-moz-range-thumb {
position: relative;
height: 16px;
width: 16px;
background: #0b111d;
border: 2px solid #00edff;
border-radius: 100%;
transition: background .2s ease, border .2s ease, transform .2s ease;
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-moz-range-thumb {
background: #0b111d;
border-color: #00edff;
transform: scale(1.25)
}
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
background: #154d71;
color: #00edff;
border-radius: 0;
}
.plyr--audio .plyr__controls {
padding: 0;
border-radius: inherit;
background: rgb(11, 17, 29);
border: 0;
color: #00edff;
width: 300px;
padding-right: 5;
height: 32px;
}
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #154d71;
color: #00edff;
border-radius: 0;
}

687
public/s/css/cyber.css Normal file
View File

@ -0,0 +1,687 @@
@import url('https://fonts.googleapis.com/css?family=Oswald:700|Press+Start+2P');
body {
margin: 1em auto 3em auto;
background-color: rgb(10, 10, 10);
color: #01ffbd;
font-family: 'Oswald', sans-serif;
font-size: 17px;
}
a {
color: #f300ff;
text-decoration: none;
}
input, select, textarea {
border: 1px double #00ffc4;
border-radius: 0;
background: #9a0039;
color: #04e8bd;
font-size: 80%;
font-family: 'Oswald', sans-serif;
margin-top: 3px;
margin-bottom: 3px;
}
a:hover {
color: #ffffff;
text-decoration: none;
}
.return {
text-align: center;
font-family: 'Press Start 2P', cursive;
font-size: 29px;
text-decoration: none;
animation: glitch2 2s steps(100) infinite;
color: white;
border-bottom: 2px solid #9a0039;
background-color: #061412;
margin-top: -60px;
}
ul#posts {
width: calc(100% - 210px);
margin: 0;
margin-left: 100px;
padding: 0;
list-style: none;
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-flex-flow: row wrap;
flex-flow: row wrap;
justify-content: flex-start;
-webkit-justify-content: flex-start;
padding-top: 1.5em;
}
.controls {
text-align: center;
color: #01f4b5;
font-weight: bold;
width: 888px;
margin: 0 auto;
background: #061412;
padding-top: 0;
border: 2px solid #9a0039;
margin-top: 60px;
}
.medium, .thumbnail {
display: flex;
justify-content: center;
margin-top: 5px;
background: #061412;
border: 2px solid #9a0039;
padding: 5px;
}
.thumb {
border: 2px solid rgb(4, 232, 189);
}
/* Color the Controls */
a#next {
color: #01f4b5;
}
a#next:hover {
animation: glitch2 2s steps(100) infinite;
}
a#random {
color: #01f4b5;
}
a#random:hover {
animation: glitch2 2s steps(100) infinite;
}
a#prev {
color: #01f4b5;
}
a#prev:hover {
animation: glitch2 2s steps(100) infinite;
}
a#holland {
color: #01f4b5;
}
a#holland:hover {
color: #cc0ccb;
animation: glitch2 2s steps(100) infinite;
}
/* PANEL */
.panel {
background-color: rgba(4, 27, 23, 0.61);
border: 2px solid #9a0039;
}
.navbar {
text-align: center;
margin-top: 7px;
width: 100%;
margin: 0 auto;
border-bottom: 2px solid #9a0039;
background: #061412;
padding-bottom: 5px;
top: 0;
}
.plyr--audio .plyr__controls {
padding: 0;
border-radius: inherit;
background: #0a0a0a;
border: 0;
color: #f300ff;
width: 300px;
padding-right: 5;
height: 32px;
}
.plyr input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
margin-top: -4px;
position: relative;
height: 16px;
width: 16px;
background: #061412;
border: 1px solid #f300ff;
border-radius: 100%;
transition: background .2s ease,border .2s ease,transform .2s ease;
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
box-sizing: border-box;
}
.plyr__progress--played, .plyr__volume--display {
z-index: 1;
color: #00efb1;
background: 0 0;
transition: none;
}
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #061412;
color: #01f4b5;
border-radius: 0;
}
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
background: #061412;
color: #01f4b5;
border-radius: 0;
}
.plyr input[type=range]:active::-webkit-slider-thumb {
background: #061412;
border-color: #01f4b5;
transform: scale(1.25)
}
.plyr--video .plyr__controls {
position: absolute;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
padding: 0px 0px 0px;
background: rgba(10, 10, 10, 0.73);
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
color: #01f4b5;
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
}
/* Feuerfick */
.plyr input[type="range"]::-moz-range-thumb {
position: relative;
height: 16px;
width: 16px;
background: #061412;
border: 2px solid #01f4b5;
border-radius: 100%;
transition: background .2s ease, border .2s ease, transform .2s ease;
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-moz-range-thumb {
background: #061412;
border-color: #01f4b5;
transform: scale(1.25)
}
@keyframes noise-anim {
0% {
clip: rect(2px, 9999px, 94px, 0);
}
5% {
clip: rect(89px, 9999px, 60px, 0);
}
10% {
clip: rect(66px, 9999px, 50px, 0);
}
15% {
clip: rect(3px, 9999px, 54px, 0);
}
20% {
clip: rect(26px, 9999px, 19px, 0);
}
25% {
clip: rect(20px, 9999px, 66px, 0);
}
30% {
clip: rect(18px, 9999px, 43px, 0);
}
35% {
clip: rect(54px, 9999px, 48px, 0);
}
40% {
clip: rect(33px, 9999px, 66px, 0);
}
45% {
clip: rect(24px, 9999px, 61px, 0);
}
50% {
clip: rect(30px, 9999px, 18px, 0);
}
55% {
clip: rect(16px, 9999px, 96px, 0);
}
60% {
clip: rect(2px, 9999px, 20px, 0);
}
65% {
clip: rect(84px, 9999px, 19px, 0);
}
70% {
clip: rect(50px, 9999px, 5px, 0);
}
75% {
clip: rect(60px, 9999px, 80px, 0);
}
80% {
clip: rect(26px, 9999px, 96px, 0);
}
85% {
clip: rect(100px, 9999px, 74px, 0);
}
90% {
clip: rect(82px, 9999px, 29px, 0);
}
95% {
clip: rect(34px, 9999px, 97px, 0);
}
100% {
clip: rect(91px, 9999px, 44px, 0);
}
}
.return:after {
content: attr(class="return");
position: absolute;
left: 2px;
text-shadow: -1px 0 red;
top: 0;
color: white;
background: black;
overflow: hidden;
clip: rect(0, 900px, 0, 0);
animation: noise-anim 2s infinite linear alternate-reverse;
}
@keyframes noise-anim-2 {
0% {
clip: rect(76px, 9999px, 52px, 0);
}
5% {
clip: rect(5px, 9999px, 11px, 0);
}
10% {
clip: rect(25px, 9999px, 9px, 0);
}
15% {
clip: rect(56px, 9999px, 30px, 0);
}
20% {
clip: rect(63px, 9999px, 93px, 0);
}
25% {
clip: rect(84px, 9999px, 63px, 0);
}
30% {
clip: rect(55px, 9999px, 54px, 0);
}
35% {
clip: rect(53px, 9999px, 52px, 0);
}
40% {
clip: rect(40px, 9999px, 66px, 0);
}
45% {
clip: rect(50px, 9999px, 15px, 0);
}
50% {
clip: rect(90px, 9999px, 31px, 0);
}
55% {
clip: rect(33px, 9999px, 4px, 0);
}
60% {
clip: rect(18px, 9999px, 57px, 0);
}
65% {
clip: rect(2px, 9999px, 21px, 0);
}
70% {
clip: rect(38px, 9999px, 93px, 0);
}
75% {
clip: rect(61px, 9999px, 44px, 0);
}
80% {
clip: rect(83px, 9999px, 27px, 0);
}
85% {
clip: rect(80px, 9999px, 51px, 0);
}
90% {
clip: rect(91px, 9999px, 39px, 0);
}
95% {
clip: rect(59px, 9999px, 36px, 0);
}
100% {
clip: rect(74px, 9999px, 80px, 0);
}
}
.return:before {
content: attr(data-text);
position: absolute;
left: -2px;
text-shadow: 1px 0 blue;
top: 0;
color: white;
background: transparent;
overflow: hidden;
clip: rect(0, 900px, 0, 0);
animation: noise-anim-2 3s infinite linear alternate-reverse;
}
@keyframes glitch2 {
0% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
1% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
2% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
3% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
4% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
5% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
6% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
7% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
8% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
9% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
10% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
11% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
12% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
13% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
14% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
15% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
16% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
17% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
18% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
19% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
20% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
21% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
22% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
23% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
24% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
25% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
26% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
27% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
28% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
29% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
30% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
31% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
32% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
33% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
34% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
35% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
36% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
37% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
38% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
39% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
40% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
41% {
text-shadow: 50px 0 0 blue, -50px 0 0 lime;
}
42% {
text-shadow: 0 0 0 blue, 0 0 0 lime;
}
43% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
44% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
45% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
46% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
47% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
48% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
49% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
50% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
51% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
52% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
53% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
54% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
55% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
56% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
57% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
58% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
59% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
60% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
61% {
text-shadow: 30px 0 0 red, -30px 0 0 lime;
}
62% {
text-shadow: 0 0 0 red, 0 0 0 lime;
}
63% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
}
64% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
}
65% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
}
66% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
}
67% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
68% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
69% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
70% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
71% {
text-shadow: 70px 0 0 red, -70px 0 0 blue;
}
72% {
text-shadow: 0 0 0 red, 0 0 0 blue;
}
73% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
74% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
75% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
76% {
text-shadow: 1px 0 0 red, -1px 0 0 blue;
}
77% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
78% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
79% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
80% {
text-shadow: -1px 0 0 red, 1px 0 0 blue;
}
81% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
82% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
83% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
84% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
85% {
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
}
86% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
87% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
88% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
89% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
90% {
text-shadow: -1px 0 0 red, 1px 0 0 lime;
}
91% {
text-shadow: 60px 0 0 lime, -60px 0 0 blue;
}
92% {
text-shadow: 0 0 0 lime, 0 0 0 blue;
}
92% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
93% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
94% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
95% {
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
}
96% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
97% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
98% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
99% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
100% {
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
}
}

View File

@ -0,0 +1,207 @@
/* written by sirx for f0ck.me */
/* use whatever you like */
ul#posts {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
grid-gap: 1em;
list-style: none;
padding: 0;
margin-top: 10px;
}
.navbar {
background-color: #1b1b1b;
position: sticky;
top: 0;
z-index: 1;
}
body {
background-color: black;
color: white;
}
html {
background-color: black;
}
.container.is-fluid {
padding-top: 10px;
}
li.post {
position: relative;
}
span.item-mime {
position: absolute;
right: 0;
top: 0;
color: #68da20;
text-shadow: 1px 1px black;
font-size: 11px;
text-transform: uppercase;
background: #000000b8;
visibility: hidden;
}
li.post:hover > span.item-mime {
visibility: visible;
}
a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, .navbar-link:focus, .navbar-link:focus-within, .navbar-link:hover, .navbar-link.is-active {
background-color: #000000;
color: #ffffff;
}
a#next, a#prev {
position: relative;
font-weight: normal;
top: 0px;
bottom: 932px;
margin: unset;
font-size: 30px;
color: #99ff00;
padding: 140px 40px 140px 40px;
cursor: pointer;
-webkit-transform: translateZ(0);
align-content: inherit;
align-self: center;
bottom: 0;
}
a#next, a#prev {
position: sticky;
top: 0;
}
.content {
display: grid;
justify-content: space-around;
grid-template-columns: 0fr 1fr 0fr;
}
.previous-post, .next-post {
display: flex;
}
img#f0ck-image {
max-width: 100%;
max-height: 500px;
}
.metadata {
text-align: center;
position: sticky;
bottom: 0;
}
a:hover {
color: #99ff00;
opacity: 0.8;
}
a {
color: #99ff00;
cursor: pointer;
text-decoration: none;
}
.navbar-item, .navbar-link {
color: white;
text-shadow: 1px 1px black;
}
.media-object {
text-align: center;
align-self: center;
}
a.id-link {
padding-right: 5;
}
div#my-video {
max-height: unset;
}
.box:not(:last-child), .content:not(:last-child), .notification:not(:last-child), .progress:not(:last-child), .table:not(:last-child), .table-container:not(:last-child), .title:not(:last-child), .subtitle:not(:last-child), .block:not(:last-child), .highlight:not(:last-child), .breadcrumb:not(:last-child), .level:not(:last-child), .list:not(:last-child), .message:not(:last-child), .pagination:not(:last-child), .tabs:not(:last-child) {
margin-bottom: 0;
margin-top: 0;
}
.video-container {
position: relative;
padding-bottom: 56.25%; /*16:9*/
padding-top: 30px;
height: 0;
overflow: hidden;
}
.video-container video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.irc {
padding: 10px;
color: white;
}
a#next:hover {
box-shadow: -1px 0px #99ff001c;
transition: all .2s;
}
a#prev:hover {
box-shadow: 1px 0px #99ff001c;
transition: all .2s;
}
.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover {
background-color: black;
}
.controls {
text-align: center;
}
.content {
min-height: 517px;
}
#themeselector {
color: #fff;
background-color: #343a40;
display: inline-block;
font-weight: 600;
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: 0.25rem;
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
border: 0;
outline: 0;
}
select {
font-size: small;
}
@media (max-width: 600px) {
a#next, a#prev {
padding: 0;
}
.content {
min-height: 0;
}
}
img#biohaz {
width: 28px;
}

389
public/s/css/f0ck95.css Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
* {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}

237
public/s/css/krautchan.css Normal file
View File

@ -0,0 +1,237 @@
body {
margin: 0em auto 3em auto;
background-color: #eeeeee;
color: #fff;
font-family: sans-serif;
}
a {
color: #3333cc;
font-weight: bold;
text-decoration: none;
}
a:hover {
color: #3d3dff;
}
.thumb {
border: 2px solid #313370;
}
.wrapper {
margin: 0 auto;
width: 888px;
}
.navbar {
margin-top: 7px;
color: #313370;
margin: 0 auto;
width: 100%;
border-bottom: 2px solid;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
background: #aaaacc;
top: 0;
}
input, select, textarea {
border: 1px double #3333cc;
background: #eeeeee;
color: #3333cc;
font-family: sans-serif;
font-size: 80%;
font-weight: bold;
}
.panel {
margin-bottom: 0;
background-color: #aaaacc;
border: 2px solid #313370;
border-radius: 0px;
padding-left: 10px;
padding-right: 10px;
width: 25%;
float: left;
position: relative;
min-height: 1px;
color: #000000;
}
.contact {
margin: 20px;
color: #000000;
}
.irc {
margin: 20px;
color: #000000;
}
code {
color: #3d3dff;
}
.return {
text-align: center;
border-bottom: 2px solid #313370;
width: 100%;
margin: 0 auto;
background: #aaaacc;
margin-bottom: 5px;
top: 0;
}
.controls {
text-align: center;
color: #3333cc;
font-weight: bold;
width: 888px;
margin: 0 auto;
background: #aaaacc;
padding-top: 0;
border: 2px solid #313370;
margin-top: 35px;
}
.medium, .thumbnail {
display: flex;
justify-content: center;
margin-top: 5px;
background: #aaaacc;
border: 2px solid #313370;
}
.panel.info {
margin: 0 auto;
margin-top: 5px;
float: none;
width: 888px;
margin-bottom: 5px;
}
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #eeeeee;
color: #3535cb;
border-radius: 0;
}
.plyr--video .plyr__controls {
position: absolute;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
padding: 0px 0px 0px;
background: rgb(238, 238, 238);
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
color: #3535cb;
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
}
span.plyr__time--current {
color: #000;
}
.plyr__progress--played, .plyr__volume--display {
z-index: 1;
color: #3535cb;
background: 0 0;
transition: none;
}
.plyr--video .plyr__progress--buffer {
color: rgb(49, 51, 112);
}
.plyr--video .plyr__progress--buffer, .plyr--video .plyr__volume--display {
background: rgb(170, 170, 204);
}
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
background: #3535cb;
color: #eeeeee;
border-radius: 0;
}
.plyr input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
margin-top: -4px;
position: relative;
height: 16px;
width: 16px;
background: #eeeeee;
border: 2px solid #3535cb;
border-radius: 100%;
transition: background .2s ease,border .2s ease,transform .2s ease;
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-webkit-slider-thumb {
background: #eeeeee;
border-color: #3535cb;
transform: scale(1.25)
}
.plyr__controls button {
position: relative;
display: inline-block;
-ms-flex-negative: 0;
flex-shrink: 0;
overflow: visible;
vertical-align: middle;
padding: 7px;
border: 0;
background: 0 0;
border-radius: 0px;
cursor: pointer;
transition: background .3s ease,color .3s ease,opacity .3s ease;
color: inherit;
}
/* Feuerfick */
.plyr input[type="range"]::-moz-range-thumb {
position: relative;
height: 16px;
width: 16px;
background: #eeeeee;
border: 2px solid #3535cb;
border-radius: 100%;
transition: background .2s ease, border .2s ease, transform .2s ease;
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-moz-range-thumb {
background: #eeeeee;
border-color: #3535cb;
transform: scale(1.25)
}
/* Audio */
.plyr--audio .plyr__controls {
padding: 0;
border-radius: inherit;
background: #eeeeee;
border: 0;
color: #3333cc;
width: 300px;
padding-right: 5;
height: 32px;
}
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #3535cb;
color: #eeeeee;
border-radius: 0;
}
.plyr--audio .plyr__progress--buffer, .plyr--audio .plyr__volume--display {
background: rgb(170, 170, 204);
}

192
public/s/css/light.css Normal file

File diff suppressed because one or more lines are too long

187
public/s/css/master.css Normal file
View File

@ -0,0 +1,187 @@
@import url('https://fonts.googleapis.com/css?family=Space+Mono');
body {
font-family: 'Space Mono', monospace;
font-size: 13px;
}
.mudderfigg {
padding: 10px;
border-radius: 5px;
display: flex;
justify-content: space-between;
}
.id {
text-align: center;
background: #262626;
padding: 5px;
border-radius: 0;
color: white;
vertical-align: baseline;
border: 1px solid #99ff00;
}
.id > a {
color: #99ff00;
}
.panel {
padding-left: 5px;
padding-right: 5px;
border-top: 2px dotted #99ff00;
}
.panel.info {
margin-top: 0px;
width: 1200px;
border: 1px solid black;
}
.wrapper {
margin: 0 auto;
width: 1200px;
border-left: 1px solid black;
border-right: 1px solid black;
}
.medium, .thumbnail {
display: flex;
justify-content: space-between;
margin-top: 0px;
background: #484747;
border: 0px solid #99ff00;
padding: 5px;
}
.controls {
border-bottom: 1px solid;
width: 1200px;
margin-top: 35px;
border: 1px solid black;
}
a#next, a#prev {
position: relative;
font-weight: normal;
top: 0px;
bottom: 932px;
margin: unset;
font-size: 18px;
color: #99ff00;
padding: 140px 40px 140px 40px;
cursor: pointer;
-webkit-transform: translateZ(0);
align-content: inherit;
align-self: center;
}
a#next, a#prev {
position: sticky;
top: 0;
}
img.van {
width: 171px;
height: 28px;
background-image: url(/s/img/f0ck_small.png);
background-position: 0px -1px;
border: 1px solid transparent;
background-repeat: no-repeat;
}
.van {
border: 0;
box-shadow: none;
}
.navbar {
padding-top: 0;
padding-bottom: 0;
}
.return {
padding: 0;
margin-top: -35px;
top: inherit;
}
.audiojs {
height: 360px;
width: 640px;
background-color: transparent;
}
input, select, textarea {
border: unset;
background: #262626;
color: #f1e3ce;
font-family: 'Space Mono', monospace;
font-size: 99%;
}
/* Blöde Box */
/*body:after {
content: "gemaked vong 1 spast, 1 nudelsuppe unt 1 hunt. hypfer isd doof.";
position: fixed;
background: #484747;
bottom: 0;
right: 0;
color: #9f0;
border-left: 1px solid black;
border-top: 1px solid black;
padding: 5px;
}*/
.my-video-dimensions {
width: 900px;
height: auto;
min-height: 500px;
}
img#f0ck-image {
max-width: 100%;
max-height: 500px;
}
.vjs-audio.vjs-has-started .vjs-poster {
display: block;
background-size: cover;
}
.vjs-poster {
background-size: cover;
}
a#elfe {
display: flex;
justify-content: center;
align-self: center;
max-height: fit-content;
max-height: -moz-fit-content;
}
.return-how {
position: unset;
margin: 0;
}
.f0ckme {
color: inherit;
text-align: center;
padding: 10px;
}
/* RIP TERRY */
.thumb[src="./t/34449.png"] {
transition-duration: 0.2s;
-webkit-transition-duration: 0.2s;
background-color: gold;
border-width: medium;
border-color: gold;
font-size: 18px;
font-style: italic;
vertical-align: middle;
height: 128px;
}

197
public/s/css/n0xy.css Normal file
View File

@ -0,0 +1,197 @@
body {
background-color: #0b0b0e;
font-family: monospace;
font-size: 15px;
}
ul#posts {
padding-top: 3.2em;
}
.wrapper {
border-left: 0;
border-right: 0;
}
.thumb {
border: 1px solid #1dadb04d;
}
.id > a {
color: #fff;
}
a {
color: #1dadb0;
text-decoration: none;
}
a:hover {
text-shadow: 2px 1px 15px #1dadb0;
color: #1dadb0;
text-decoration: none;
}
a#next, a#prev {
color: #1dadb0;
}
.navbar {
border-bottom-color: currentcolor;
border-bottom-style: none;
border-bottom-width: 0px;
background-color: #121212;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
color: #1dadb0;
text-shadow: 0 1px 1px #000;
overflow: auto;
border-bottom: 1px solid;
box-shadow: 0 0 5px rgb(0, 0, 0);
}
.return {
border-bottom-color: currentcolor;
border-bottom-style: none;
border-bottom-width: 0px;
background-color: #121212;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
color: #1dadb0;
text-shadow: 0 1px 1px #000;
overflow: auto;
border-bottom: 1px solid;
box-shadow: 0 0 5px rgb(0, 0, 0);
margin-top: -55px;
}
.controls {
border: 0;
border-bottom-color: currentcolor;
border-bottom-style: none;
border-bottom-width: 0px;
background-color: #121212;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
color: #1dadb0;
text-shadow: 0 1px 1px #000;
overflow: auto;
border-bottom: 1px solid;
box-shadow: 0 0 5px rgb(0, 0, 0);
margin-top: 55px;
margin-bottom: 10px;
}
.medium {
background-color: #121212;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
color: #1dadb0;
text-shadow: 0 1px 1px #000;
overflow: auto;
box-shadow: 0 0 5px rgb(0, 0, 0);
padding-top: 15px;
padding-bottom: 15px;
border-bottom: 1px solid;
}
.panel.info {
border-bottom-color: currentcolor;
border-bottom-style: none;
border-bottom-width: 0px;
background-color: #121212;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
color: #1dadb0;
text-shadow: 0 1px 1px #000;
overflow: auto;
box-shadow: 0 0 5px rgb(0, 0, 0);
border: 0;
margin-top: 10px;
border-bottom: 1px solid;
}
.id {
background: #090909;
background-image: none;
color: #1dadb0;
border: 0;
align-self: center;
font-size: 90%;
border-radius: 5px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
box-shadow: 0 0 5px rgb(0, 0, 0);
}
img {
box-shadow: none;
}
input, select, textarea {
border: 1px solid transparent;
background: #090909;
color: #1dadb0;
font-family: 'Hack', monospace, sans-serif;
font-size: 100%;
}
code {
color: #1dadb0;
padding: 5px;
background: black;
border: 1px solid;
}
img.van {
width: 276px;
height: 45px;
background-image: url(/s/img/f0xy.png);
background-position: 0px -1px;
border: 1px solid transparent;
background-repeat: no-repeat;
}
.return > a {
display: inline-block;
vertical-align: bottom;
}
.video-js .vjs-control-bar {
background-color: #161618 !important;
color: #fff;
font-size: 12px;
}
.video-js .vjs-big-play-button {
background-color: #1dadb04d;
}
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus, .video-js .vjs-big-play-button:active {
background-color: #1dadb0;
}
.video-js .vjs-play-progress, .video-js .vjs-volume-level {
background-color: #1dadb0;
}
.video-js {
background-color: #000;
}
.video-js .vjs-control:focus::before, .video-js .vjs-control:hover::before {
text-shadow: 0px 0px 0.2em #fff,0 0 0.2em #262626,0 0 0.2em #262626;
}
.video-js .vjs-loading-spinner {
border-color: #1dadb0;
}
div#my-video {
border-radius: 0px;
box-shadow: none;
margin-bottom: 15px;
margin-top: 15px;
border: 2px solid #161618;
}
.navbar > a {
display: inline-block;
vertical-align: bottom;
}

181
public/s/css/pink.css Normal file
View File

@ -0,0 +1,181 @@
.thumb {
border: 2px solid #ff008d;
}
body {
margin: 0em auto 3em auto;
background-color: #1b1a1a;
color: #848484;
font-family: Monospace;
font-size: 12px;
}
a {
color: #fff;
}
a:hover {
color: #ff008d;
}
input, select, textarea {
border: 1px double #ff008d;
background: #2f2f2f;
color: #ffffff;
font-family: 'Hack', monospace, sans-serif;
font-size: 80%;
}
.return {
text-align: center;
font-size: 25px;
border-bottom: 2px solid #ff008d;
margin-top: -55px;
}
.controls {
text-align: center;
color: #ff008d;
font-weight: bold;
width: 888px;
margin: 0 auto;
background: #484747;
padding-top: 0;
margin-top: 55px;
border: 2px solid #ff008d;
}
.navbar {
margin: 0 auto;
width: 100%;
border: 0;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
position: fixed;
overflow: visible;
z-index: 999;
background-color: #484747;
border-bottom: 2px solid #ff008d;
text-align: center;
top: 0;
color: #ff008d;
}
.medium, .thumbnail {
display: flex;
justify-content: center;
margin-top: 5px;
background: #484747;
border: 2px solid #ff008d;
padding: 5px;
}
span.id {
color: #ffffff;
}
a#holland {
color: #ff008d;
}
code {
color: #ff008d;
}
.panel {
margin-bottom: 0;
background-color: rgb(72, 71, 71);
border: 2px solid #ff008d;
border-radius: 0px;
padding-left: 10px;
padding-right: 10px;
width: 25%;
float: left;
position: relative;
min-height: 1px;
}
.plyr--audio .plyr__controls {
padding: 0;
border-radius: inherit;
background: #1b1a1a;
border: 0;
color: #ff008d;
width: 300px;
padding-right: 5;
height: 32px;
}
.plyr input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
margin-top: -4px;
position: relative;
height: 16px;
width: 16px;
background: #262626;
border: 1px solid #ff008d;
border-radius: 100%;
transition: background .2s ease,border .2s ease,transform .2s ease;
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
box-sizing: border-box;
}
.plyr__progress--played, .plyr__volume--display {
z-index: 1;
color: #ff008d;
background: 0 0;
transition: none;
}
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #484747;
color: #ff008d;
border-radius: 0;
}
.plyr input[type=range]:active::-webkit-slider-thumb {
background: #262626;
border-color: #ff008d;
transform: scale(1.25)
}
.plyr--video .plyr__controls {
position: absolute;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
padding: 0px 0px 0px;
background: rgba(38, 38, 38, 0.97);
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
color: #ff008d;
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
}
/* Feuerfick */
.plyr input[type="range"]::-moz-range-thumb {
position: relative;
height: 16px;
width: 16px;
background: #ff008d;
border: 2px solid #262626;
border-radius: 100%;
transition: background .2s ease, border .2s ease, transform .2s ease;
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-moz-range-thumb {
background: #ff008d;
border-color: #262626;
transform: scale(1.25)
}
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
background: #484747;
color: #ff008d;
border-radius: 0;
}

1
public/s/css/plyr.css Normal file

File diff suppressed because one or more lines are too long

323
public/s/css/style.css Normal file
View File

@ -0,0 +1,323 @@
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
html, body {
max-height: 100%;
width: 100%;
}
body {
margin: 0em auto 3em auto;
background-color: #262626;
color: #fff;
font-family: Monospace;
font-size: 12px;
line-height: 1.42857143;
}
.contact {
margin: 20px;
}
input, select, textarea {
border: 1px double #99ff00;
background: #282A2E;
color: #f1e3ce;
font-family: 'Hack', monospace, sans-serif;
font-size: 80%;
}
ul#posts {
width: calc(100% - 210px);
margin: 0;
margin-left: 100px;
padding: 0;
list-style: none;
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-flex-flow: row wrap;
flex-flow: row wrap;
justify-content: flex-start;
-webkit-justify-content: flex-start;
padding-top: 2.2em;
}
li.post {
padding: 5px;
width: 128px;
height: 128px;
margin-top: 5px;
line-height: 128px;
-webkit-flex: 1 1 auto;
ms-flex: 1 1 auto;
flex: 1 1 auto;
}
.thumb {
border: 2px solid #4c4a4a;
}
.thumb:hover {
opacity: 0.7;
}
.clear {
clear: both;
padding: 1em 0;
}
a {
color: #9f0;
text-decoration: none;
}
a:hover {
color: #74c100;
text-decoration: underline;
}
.medium, .thumbnail {
display: flex;
justify-content: center;
margin-top: 5px;
background: #484747;
border: 0px solid #99ff00;
padding: 5px;
}
.info {
padding-top: 5px;
}
.id {
text-align: center;
padding-bottom: 10px;
}
.controls {
text-align: center;
font-weight: bold;
width: 888px;
margin: 0 auto;
padding-top: 0;
margin-top: 35px;
border: 0px solid #99ff00;
color: #99ff00;
background: #484747;
}
.navbar {
margin: 0 auto;
width: 100%;
border: 0;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
position: fixed;
overflow: visible;
z-index: 999;
background-color: #484747;
border-bottom: 2px solid #99ff00;
text-align: center;
}
.return {
text-align: center;
border: 0;
width: 100%;
margin: 0 auto;
margin-bottom: 5px;
margin-top: -35px;
position: fixed;
overflow: visible;
z-index: 999;
border-bottom: 1px solid #99ff00;
padding: 5px;
background: #484747;
font-weight: bold;
}
.irc {
margin: 20px;
}
code {
color: #9df943;
}
.panel {
margin-bottom: 0;
background-color: #484747;
border: 0px solid #99ff00;
border-radius: 0px;
padding-left: 10px;
padding-right: 10px;
width: 25%;
float: left;
position: relative;
min-height: 1px;
color: #ffffff;
padding-bottom: 5px;
}
.panel.info {
margin: 0 auto;
margin-top: 5px;
float: none;
width: 888px;
margin-bottom: 5px;
}
img {
vertical-align: middle;
max-height: 770px;
border: 1px solid black;
box-shadow: 0 0 5px #000;
}
.wrapper {
margin: 0 auto;
width: 888px;
}
video#player {
max-width: 100%;
height: 50%;
}
/* Plyr */
.plyr--audio .plyr__controls {
padding: 0;
border-radius: inherit;
background: #262626;
border: 0;
color: #99ff00;
width: 300px;
padding-right: 5;
height: 32px;
}
.plyr audio, .plyr video {
width: 100%;
height: auto!important;
vertical-align: middle;
border-radius: inherit;
}
/* Video Player Style */
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
background: #484747;
color: #9f0;
border-radius: 0;
}
.plyr--video .plyr__controls {
position: absolute;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
padding: 0px 0px 0px;
background: rgba(38, 38, 38, 0.97);
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
color: #91ee06;
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
}
.plyr {
position: relative;
max-width: 100%;
min-width: 200px;
font-family: Avenir,'Avenir Next','Helvetica Neue','Segoe UI',Helvetica,Arial,sans-serif;
direction: ltr;
border: 1px solid #0c0d0c;
box-shadow: 0 0 15px #000;
}
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
background: #484747;
color: #9f0;
border-radius: 0;
}
.plyr__progress--played, .plyr__volume--display {
z-index: 1;
color: #99ff00;
background: 0 0;
transition: none;
}
.plyr input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
margin-top: -4px;
position: relative;
height: 16px;
width: 16px;
background: #262626;
border: 1px solid #99ff00;
border-radius: 100%;
transition: background .2s ease,border .2s ease,transform .2s ease;
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-webkit-slider-thumb {
background: #262626;
border-color: #99ff00;
transform: scale(1.25)
}
.plyr--fullscreen-active video {
height: 100%!important;
max-width: 100%!important;
}
.plyr--fullscreen-active {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 100%;
width: 100%;
z-index: 10000000;
background: #000;
border-radius: 0!important;
border: 0!important;
}
/* Feuerfick */
.plyr input[type="range"]::-moz-range-thumb {
position: relative;
height: 16px;
width: 16px;
background: #9f0;
border: 2px solid #262626;
border-radius: 100%;
transition: background .2s ease, border .2s ease, transform .2s ease;
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
box-sizing: border-box;
}
.plyr input[type=range]:active::-moz-range-thumb {
background: #9f0;
border-color: #262626;
transform: scale(1.25)
}
.savetheinternet {
position: fixed;
bottom: 0;
left: 0;
right: 0;
text-align: center;
background: black;
}
.f0ckme {
color: inherit;
text-align: center;
padding: 10px;
}
pre {
letter-spacing: 7px;
}

277
public/s/css/term.css Normal file
View File

@ -0,0 +1,277 @@
@import url('https://fonts.googleapis.com/css?family=VT323');
body {
margin: 0em auto 3em auto;
background-color: #040404;
color: #fff;
font-family: 'VT323', monospace;
font-size: 18px;
}
span.id {
color: #00DF00;
text-shadow: 0 0 20px #00DF00;
background: #040404;
box-shadow: 0 0 7px 0px #00df00;
border-radius: 5px;
border: unset;
}
img.van {
width: 171px;
height: 28px;
background-image: url(/s/img/term_f0ck_logo.png);
background-position: 0px -1px;
border: 1px solid transparent;
background-repeat: no-repeat;
}
.id > a {
color: rgba(255,0,247,1);
}
span.src>a {
color: #ff00f7;
text-shadow: 0 0 20px #ff00f7;
}
input, select, textarea {
border: 1px double #ff00f7;
background: #282A2E;
color: #f1e3ce;
font-family: 'VT323', 'Courier', monospace;
font-size: 80%;
-moz-box-shadow: 0px 0px 37px 5px rgba(43,255,0,1);
-webkit-box-shadow: 0px 0px 10px 0px rgba(255,0,247,1);
-moz-box-shadow: 0px 0px 10px 0px rgba(255,0,247,1);
box-shadow: 0px 0px 10px 0px rgba(255,0,247,1);
}
.return {
text-align: center;
font-size: 17px;
color: #00DF00;
text-shadow: 0 0 20px #00DF00;
background: #0b0b0b;
border-bottom: 2px solid #03dc03;
margin-top: -35px;
}
.controls {
text-align: center;
color: #00d500;
font-weight: bold;
margin: 0 auto;
background: #0b0b0b;
padding-top: 0;
margin-top: 35px;
border: 2px solid #03dc03;
}
.medium, .thumbnail {
display: flex;
justify-content: space-between;
margin-top: 5px;
background: #0b0b0b;
border: 2px solid #03dc03;
padding: 5px;
}
div#my-video {
border-radius: 5px;
box-shadow: 0 0 20px #000000;
margin-bottom: 15px;
margin-top: 15px;
}
a#elfe {
margin-bottom: 15px;
margin-top: 15px;
}
a#next {
color: #00DF00;
text-shadow: 0 0 20px #00DF00;
}
a#random {
color: #00DF00;
text-shadow: 0 0 20px #00DF00;
}
a#prev {
color: #00DF00;
text-shadow: 0 0 20px #00DF00;
}
.panel {
margin-bottom: 0;
background-color: rgba(16, 16, 16, 0.61);
border: 2px solid #0b842b;
border-radius: 0px;
padding-left: 10px;
padding-right: 10px;
width: 25%;
float: left;
position: relative;
min-height: 1px;
}
.thumb:hover {
opacity: 0.7;
-webkit-box-shadow: 0px 0px 6px 0px rgba(0,255,30,1)
-moz-box-shadow: 0px 0px 6px 0px rgba(0,255,30,1);
box-shadow: 0px 0px 6px 0px rgba(0,255,30,1);
}
.thumb {
border: 2px solid #00df00;
}
.navbar {
margin: 0 auto;
width: 100%;
border: 0;
padding-top: 0;
padding-bottom: 0;
font-weight: bold;
position: fixed;
overflow: visible;
z-index: 999;
background-color: #0b0b0b;
border-bottom: 2px solid #00df00;
text-align: center;
top: 0;
color: #00df00;
}
.navbar>a {
color: rgba(43,255,0,1);
text-shadow: 0 0 20px #00DF00;
}
.navbar>a:hover {
color: #00b700;
}
.contact>a {
color: rgba(43,255,0,1);
text-shadow: 0 0 20px #00DF00;
}
.contact>a:hover {
color: #00b700;
}
code {
color: rgba(43,255,0,1);
text-shadow: 0 0 20px;
}
a {
color: #00df00;
text-shadow: 0 0 20px;
}
a:hover {
color: #00b700;
}
.plyr__progress--played, .plyr__volume--display {
z-index: 1;
color: #00df00;
background: 0 0;
transition: none;
}
select#themeSelector {
color: #00DF00;
text-shadow: 0 0 20px #00DF00;
background: #040404;
border-radius: 0;
border: unset;
box-shadow: unset;
padding-bottom: 3px;
padding-top: 3px;
}
input, select, textarea {
border: #00df00;
}
.wrapper {
margin: 0 auto;
border-left: 0px solid black;
border-right: 0px solid black;
}
img {
vertical-align: middle;
border: 0;
box-shadow: 0px 0px 20px 0px black;
}
.panel {
border-top: 0px;
}
.panel.info {
border: 0;
border-left: 2px solid #03dc03;
border-right: 2px solid #03dc03;
border-bottom: 2px solid #03dc03;
}
.options {
padding-left: 10px;
}
.video-js .vjs-loading-spinner {
border-color: #03dc03;
}
.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before {
text-shadow: 0 0 0.8em #03dc03, 0 0 0.8em #03dc03, 0 0 0.8em #03dc03;
}
.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before, .video-js .vjs-control:focus {
text-shadow: 0 0 1em #03dc03;
}
.video-js .vjs-control-bar {
background-color: rgba(4, 4, 4, 0.82) !important;
color: #ffffff;
font-size: 12px;
}
.video-js .vjs-control-bar {
background-color: rgba(4, 4, 4, 0.82) !important;
color: #ffffff;
font-size: 12px;
}
i.fa.fa-cog {
display: none;
}
.options {
display: flex;
justify-content: center;
padding: 10px;
}
.video-js .vjs-play-progress, .video-js .vjs-volume-level {
background-color: #03dc03;
box-shadow: 0 0 20px 0px #01de01;
}
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus, .video-js .vjs-big-play-button:active {
background-color: #00df00;
box-shadow: 0 0 10px 0px #00df00;
}
.video-js.vjs-fullscreen, .video-js.vjs-fullscreen .vjs-tech {
margin-bottom: 0 !important;
margin-top: 0 !important;
}

1
public/s/css/video-js.min.css vendored Normal file

File diff suppressed because one or more lines are too long

276
public/s/css/vsg-skin.css Normal file
View File

@ -0,0 +1,276 @@
.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {
width: 10em
}
.video-js .vjs-controls-disabled .vjs-big-play-button {
display: none!important
}
.video-js .vjs-control {
width: 3em
}
.video-js .vjs-menu-button-inline:before {
width: 1.5em
}
.vjs-menu-button-inline .vjs-menu {
left: 3em
}
.vjs-paused.vjs-has-started.video-js .vjs-big-play-button,.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button {
display: block
}
.video-js .vjs-load-progress div,.vjs-seeking .vjs-big-play-button,.vjs-waiting .vjs-big-play-button {
display: none!important
}
.video-js .vjs-mouse-display:after,.video-js .vjs-play-progress:after {
padding: 0 .4em .3em
}
.video-js.vjs-ended .vjs-loading-spinner {
display: none;
}
.video-js.vjs-ended .vjs-big-play-button {
display: block !important;
}
.video-js *,.video-js:after,.video-js:before {
box-sizing: inherit;
font-size: inherit;
color: inherit;
line-height: inherit
}
.video-js.vjs-fullscreen,.video-js.vjs-fullscreen .vjs-tech {
width: 100%!important;
height: 100%!important
}
.video-js {
font-size: 14px;
overflow: hidden
}
.video-js .vjs-control {
color: inherit
}
.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {
width: 8.35em
}
.video-js .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content {
height: 3em;
width: 6.35em
}
.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before {
text-shadow: 0 0 1em #fff,0 0 1em #fff,0 0 1em #fff
}
.video-js .vjs-spacer,.video-js .vjs-time-control {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-flex: 1 1 auto;
-moz-box-flex: 1 1 auto;
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
flex: 1 1 auto
}
.video-js .vjs-time-control {
-webkit-box-flex: 0 1 auto;
-moz-box-flex: 0 1 auto;
-webkit-flex: 0 1 auto;
-ms-flex: 0 1 auto;
flex: 0 1 auto;
width: auto
}
.video-js .vjs-time-control.vjs-time-divider {
width: 14px
}
.video-js .vjs-time-control.vjs-time-divider div {
width: 100%;
text-align: center
}
.video-js .vjs-time-control.vjs-current-time {
margin-left: 1em
}
.video-js .vjs-time-control .vjs-current-time-display,.video-js .vjs-time-control .vjs-duration-display {
width: 100%
}
.video-js .vjs-time-control .vjs-current-time-display {
text-align: right
}
.video-js .vjs-time-control .vjs-duration-display {
text-align: left
}
.video-js .vjs-play-progress:before,.video-js .vjs-progress-control .vjs-play-progress:before,.video-js .vjs-remaining-time,.video-js .vjs-volume-level:after,.video-js .vjs-volume-level:before,.video-js.vjs-live .vjs-time-control.vjs-current-time,.video-js.vjs-live .vjs-time-control.vjs-duration,.video-js.vjs-live .vjs-time-control.vjs-time-divider,.video-js.vjs-no-flex .vjs-time-control.vjs-remaining-time {
display: none
}
.video-js.vjs-no-flex .vjs-time-control {
display: table-cell;
width: 4em
}
.video-js .vjs-progress-control {
position: absolute;
left: 0;
right: 0;
width: 100%;
height: .5em;
top: -.5em
}
.video-js .vjs-progress-control .vjs-load-progress,.video-js .vjs-progress-control .vjs-play-progress,.video-js .vjs-progress-control .vjs-progress-holder {
height: 100%
}
.video-js .vjs-progress-control .vjs-progress-holder {
margin: 0
}
.video-js .vjs-progress-control:hover {
height: 1.5em;
top: -1.5em
}
.video-js .vjs-control-bar {
-webkit-transition: -webkit-transform .1s ease 0s;
-moz-transition: -moz-transform .1s ease 0s;
-ms-transition: -ms-transform .1s ease 0s;
-o-transition: -o-transform .1s ease 0s;
transition: transform .1s ease 0s
}
.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar {
visibility: visible;
opacity: 1;
-webkit-backface-visibility: hidden;
-webkit-transform: translateY(3em);
-moz-transform: translateY(3em);
-ms-transform: translateY(3em);
-o-transform: translateY(3em);
transform: translateY(3em);
-webkit-transition: -webkit-transform 1s ease 0s;
-moz-transition: -moz-transform 1s ease 0s;
-ms-transition: -ms-transform 1s ease 0s;
-o-transition: -o-transform 1s ease 0s;
transition: transform 1s ease 0s
}
.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-progress-control,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-progress-control {
height: .25em;
top: -.25em;
pointer-events: none;
-webkit-transition: height 1s,top 1s;
-moz-transition: height 1s,top 1s;
-ms-transition: height 1s,top 1s;
-o-transition: height 1s,top 1s;
transition: height 1s,top 1s
}
.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive.vjs-fullscreen .vjs-progress-control,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive.vjs-fullscreen .vjs-progress-control {
opacity: 0;
-webkit-transition: opacity 1s ease 1s;
-moz-transition: opacity 1s ease 1s;
-ms-transition: opacity 1s ease 1s;
-o-transition: opacity 1s ease 1s;
transition: opacity 1s ease 1s
}
.video-js.vjs-live .vjs-live-control {
margin-left: 1em
}
.video-js .vjs-big-play-button {
top: 50%;
left: 50%;
margin-left: -1em;
margin-top: -1em;
width: 2em;
height: 2em;
line-height: 2em;
border: none;
border-radius: 50%;
font-size: 3.5em;
background-color: rgba(0,0,0,.45);
color: #fff;
-webkit-transition: border-color .4s,outline .4s,background-color .4s;
-moz-transition: border-color .4s,outline .4s,background-color .4s;
-ms-transition: border-color .4s,outline .4s,background-color .4s;
-o-transition: border-color .4s,outline .4s,background-color .4s;
transition: border-color .4s,outline .4s,background-color .4s
}
.video-js .vjs-menu-button-popup .vjs-menu {
left: -3em
}
.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
background-color: transparent;
width: 12em;
left: -1.5em;
padding-bottom: .5em
}
.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-item,.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-title {
background-color: #151b17;
margin: .3em 0;
padding: .5em;
border-radius: .3em
}
.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-item.vjs-selected {
background-color: #2483d5
}
.video-js .vjs-big-play-button {
background-color: rgba(0,0,0,0.5);
font-size: 2.5em;
border-radius: 20%;
height: 1.4em !important;
line-height: 1.4em !important;
margin-top: -0.7em !important
}
.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus,.video-js .vjs-big-play-button:active {
background-color: #99ff00
}
.video-js .vjs-loading-spinner {
border-color: #99ff00
}
.video-js .vjs-control-bar2 {
background-color: #262626
}
.video-js .vjs-control-bar {
background-color: #262626 !important;
color: #ffffff;
font-size: 12px
}
.video-js .vjs-play-progress,.video-js .vjs-volume-level {
background-color: #99ff00
}
.video-js .vjs-load-progress {
background: rgba(255,255,255,0.3);
}

88
public/s/css/x34.css Normal file
View File

@ -0,0 +1,88 @@
@import url('https://fonts.googleapis.com/css?family=Orbitron');
body {
background: black;
font-family: 'Orbitron', sans-serif;
}
.navbar, .return {
background-color: #000000;
border-bottom: 2px solid #f50083;
box-shadow: 0px -2px 20px #f600c1;
}
img.van {
width: 171px;
height: 28px;
background-image: url(/s/img/x34_f0ck_logo.png);
background-position: 0px -1px;
border: 1px solid transparent;
background-repeat: no-repeat;
}
a, a:hover {
color: #f50083;
text-shadow: 0px 0px 10px #f50083;
}
.thumb {
box-shadow: 0 0 10px #f50083;
border: 2px solid #f50083;
}
.return {
margin-top: -50px;
}
.controls {
margin-top: 50px;
background: #050505;
border: 1px solid #f50083;
}
.wrapper {
border-left: 1px solid #f50083;
border-right: 1px solid #f50083;
}
.panel.info {
border: 1px solid #f50083;
}
.medium, .thumbnail {
background: #050505;
}
.panel {
background-color: #050505;
}
.id {
background: #000000;
border: 1px solid #f50083;
}
a#next, a#prev {
color: #f50083;
}
.id > a {
color: #f50083;
}
input, select, textarea {
background: #000000;
font-family: 'Orbitron', sans-serif;
}
.video-js .vjs-play-progress, .video-js .vjs-volume-level {
background-color: #f50083;
}
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus, .video-js .vjs-big-play-button:active {
background-color: #f50083;
}
.video-js .vjs-control-bar {
background-color: #000000 !important;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

BIN
public/s/img/200.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
public/s/img/95_buttons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

BIN
public/s/img/f0ck-lol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
public/s/img/f0ck.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
public/s/img/f0ck_small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
public/s/img/f0ckme.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
public/s/img/f0xy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
public/s/img/favicon.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
public/s/img/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/s/img/how2f.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

BIN
public/s/img/how_20px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/s/img/mp3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
public/s/img/pingu.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 KiB

1
public/s/img/plyr.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"><symbol id="plyr-captions-off" viewBox="0 0 18 18"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on" viewBox="0 0 18 18"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-enter-fullscreen" viewBox="0 0 18 18"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen" viewBox="0 0 18 18"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward" viewBox="0 0 18 18"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-muted" viewBox="0 0 18 18"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause" viewBox="0 0 18 18"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zM12 1c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-play" viewBox="0 0 18 18"><path d="M15.562 8.1L3.87.225C3.052-.337 2 .225 2 1.125v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart" viewBox="0 0 18 18"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind" viewBox="0 0 18 18"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-volume" viewBox="0 0 18 18"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
public/s/img/rnd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

BIN
public/s/img/roll22.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
public/s/img/trash_20px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/s/img/win95Beam.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

7
public/s/js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

3772
public/s/js/plyr.js Normal file

File diff suppressed because it is too large Load Diff

21
public/s/js/scroller.js Normal file
View File

@ -0,0 +1,21 @@
let load = false;
(() => {
const posts = document.querySelector("#posts");
document.addEventListener("wheel", e => {
if((((document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop + window.innerHeight) + 310
>= ((document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight)) && !load) {
load = true;
fetch(`./api/p/${posts.dataset.last}`)
.then(res => res.json())
.then((msg, html = "") => {
for(let i = 0; i < msg.items.length; i++)
if(msg.items[i].id)
html += `<li class="post"><a href="./${msg.items[i].id}" title="${msg.items[i].mime}"><img class="thumb" src="./t/${msg.items[i].id}.png" /></a></li>\n`;
posts.insertAdjacentHTML("beforeend", html);
posts.dataset.last = msg.last;
load = false;
})
.catch(err => console.log(err));
}
});
})();

25
public/s/js/shit.js Normal file
View File

@ -0,0 +1,25 @@
const clickOnElementBinding = selector => () => (elem = document.querySelector(selector))?elem.click():null;
const keybindings = {
"ArrowLeft": clickOnElementBinding("#next"),
"ArrowRight": clickOnElementBinding("#prev"),
"r": clickOnElementBinding("#random")
};
(() => {
document.addEventListener("keydown", e => {
if(e.key in keybindings) {
e.preventDefault();
keybindings[e.key]();
}
});
const f0ckimage = document.querySelector("#f0ck-image");
if(f0ckimage) {
f0ckimage.addEventListener("click", e => {
e.preventDefault();
f0ckimage.hasAttribute("style")?f0ckimage.removeAttribute("style"):f0ckimage.setAttribute("style", "max-height: unset;");
});
}
})();
//sorry, jQuery ist dumm :--D sorry sirx, dass ich wonnes Kot auskommentiert habe

98
public/s/js/theme.js Normal file
View File

@ -0,0 +1,98 @@
/* Thanks to StephenLynx, I modified his Theme Changer from the Penumbra Lynx Frontend for the Lynxchan Software https://gitgud.io/LynxChan/LynxChan and reused it to make f0ck a nicer place. */
var themes = [ {
file : 'f0ck95.css',
label : 'f0ck95',
id : 'f0ck95'
}];
let interval = null;
const clocklol = () => {
const l = document.querySelector("body");
if(localStorage.selectedTheme && localStorage.selectedTheme === "f0ck95")
interval = setInterval((d = new Date()) => l.setAttribute("data-clock", d.toLocaleTimeString()), 1e3);
else {
clearInterval(interval);
l.removeAttribute("data-clock");
}
};
const speaker = () => {
const k = document.querySelector("body");
if(localStorage.selectedTheme && localStorage.selectedTheme === "f0ck95")
k.document.createElement("div");
else {
return;
}
};
var customCss;
var addedTheme;
function updateCss() {
if (addedTheme) {
addedTheme.parentNode.removeChild(addedTheme);
addedTheme = null;
}
for (var i = 0; i < themes.length; i++) {
var theme = themes[i];
if (theme.id === localStorage.selectedTheme) {
addedTheme = theme.element;
document.head.insertBefore(theme.element, customCss);
}
}
}
for (var i = 0; i < document.head.children.length; i++) {
var element = document.head.children[i];
if (element.rel === 'stylesheet' && element.href.indexOf('/css/custom.css') > -1) {
customCss = element;
break;
}
}
for (var i = 0; i < themes.length; i++) {
themes[i].element = document.createElement('link');
themes[i].element.type = 'text/css';
themes[i].element.rel = 'stylesheet';
themes[i].element.href = './s/css/' + themes[i].file;
}
clocklol();
updateCss();
var postingLink = document.getElementById('themes');
if (postingLink) {
var divider = document.createElement('span');
divider.style = ('display: none;');
divider.innerHTML = '';
var referenceNode = postingLink.nextSibling;
postingLink.parentNode.insertBefore(divider, referenceNode);
var themeSelector = document.createElement('select');
themeSelector.id = 'themeSelector';
var vanillaOption = document.createElement('option');
vanillaOption.innerHTML = 'Default';
themeSelector.appendChild(vanillaOption);
for (i = 0; i < themes.length; i++) {
var theme = themes[i];
var themeOption = document.createElement('option');
themeOption.innerHTML = theme.label;
if (theme.id === localStorage.selectedTheme) {
themeOption.selected = true;
}
themeSelector.appendChild(themeOption);
}
themeSelector.onchange = function() {
if (!themeSelector.selectedIndex) {
if (localStorage.selectedTheme) {
delete localStorage.selectedTheme;
clocklol();
updateCss();
}
return;
}
var selectedTheme = themes[themeSelector.selectedIndex - 1];
if (selectedTheme.id === localStorage.selectedTheme) {
return;
}
localStorage.selectedTheme = selectedTheme.id;
clocklol();
updateCss();
};
postingLink.parentNode.insertBefore(themeSelector, referenceNode);
}

25
public/s/js/video.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,123 @@
"use strict";
(function(factory){
/*!
* Custom Universal Module Definition (UMD)
*
* Video.js will never be a non-browser lib so we can simplify UMD a bunch and
* still support requirejs and browserify. This also needs to be closure
* compiler compatible, so string keys are used.
*/
if (typeof define === 'function' && define['amd']) {
define(['./video'], function(vjs){ factory(window, document, vjs) });
// checking that module is an object too because of umdjs/umd#35
} else if (typeof exports === 'object' && typeof module === 'object') {
factory(window, document, require('video.js'));
} else {
factory(window, document, videojs);
}
})(function(window, document, vjs) {
//cookie functions from https://developer.mozilla.org/en-US/docs/DOM/document.cookie
var
getCookieItem = function(sKey) {
if (!sKey || !hasCookieItem(sKey)) { return null; }
var reg_ex = new RegExp(
"(?:^|.*;\\s*)" +
window.escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") +
"\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"
);
return window.unescape(document.cookie.replace(reg_ex,"$1"));
},
setCookieItem = function(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return; }
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
sExpires = vEnd === Infinity ? "; expires=Tue, 19 Jan 2038 03:14:07 GMT" : "; max-age=" + vEnd;
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toGMTString();
break;
}
}
document.cookie =
window.escape(sKey) + "=" +
window.escape(sValue) +
sExpires +
(sDomain ? "; domain=" + sDomain : "") +
(sPath ? "; path=" + sPath : "") +
(bSecure ? "; secure" : "");
},
hasCookieItem = function(sKey) {
return (new RegExp(
"(?:^|;\\s*)" +
window.escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") +
"\\s*\\=")
).test(document.cookie);
},
hasLocalStorage = function() {
try {
window.localStorage.setItem('persistVolume', 'persistVolume');
window.localStorage.removeItem('persistVolume');
return true;
} catch(e) {
return false;
}
},
getStorageItem = function(key) {
return hasLocalStorage() ? window.localStorage.getItem(key) : getCookieItem(key);
},
setStorageItem = function(key, value) {
return hasLocalStorage() ? window.localStorage.setItem(key, value) : setCookieItem(key, value, Infinity, '/');
},
extend = function(obj) {
var arg, i, k;
for (i = 1; i < arguments.length; i++) {
arg = arguments[i];
for (k in arg) {
if (arg.hasOwnProperty(k)) {
obj[k] = arg[k];
}
}
}
return obj;
},
defaults = {
namespace: ""
},
volumePersister = function(options) {
var player = this;
var settings = extend({}, defaults, options || {});
var key = settings.namespace + '-' + 'volume';
var muteKey = settings.namespace + '-' + 'mute';
player.on("volumechange", function() {
setStorageItem(key, player.volume());
setStorageItem(muteKey, player.muted());
});
var persistedVolume = getStorageItem(key);
if(persistedVolume !== null){
player.volume(persistedVolume);
}
var persistedMute = getStorageItem(muteKey);
if(persistedMute !== null){
player.muted('true' === persistedMute);
}
};
vjs.plugin("persistvolume", volumePersister);
});

View File

View File

@ -1,44 +1,22 @@
import sql from "./sql";
import config from "../../config.json";
export let admins = [];
export const loadAdmins = async () => {
const db = await sql;
admins = [];
try {
const rows = await db.query("select id, prefix, account, level, network from user");
rows.forEach(row => admins.push({
id: row.id,
prefix: row.prefix,
account: row.account,
network: row.network,
level: row.level
}));
} catch(err) {
console.log("keine Admins vorhanden", err);
}
};
(async () => {
await loadAdmins();
})();
export const getLevel = (network, user) => {
export const getLevel = user => {
let ret = {
level: 0,
verified: false
};
if (typeof user !== "object")
return "user has to be an object!";
if (!user.account || !user.prefix)
if (!user.prefix)
return ret;
for(let admin of admins) {
if (admin.account === user.account.toLowerCase() && admin.network === network.toLowerCase()) {
ret = {
level: admin.level,
verified: user.prefix.toLowerCase() === admin.prefix
};
}
};
let admin;
if(admin = config.admins.filter(e => e.prefix === user.prefix)[0]) {
ret = {
level: admin.level,
verified: true
};
}
return ret;
};

View File

@ -1,10 +1,25 @@
import logger from "../log.mjs";
const versions = [
"AmIRC.1 (8 Bit) for Commodore Amiga 500",
"HexChat 0.72 [x86] / Windows 95c [500MHz]"
];
export default self => {
self.bot.on("ctcp:version", e => {
e.write(`notice ${e.user.nick} :\u0001VERSION ${versions[~~(Math.random() * versions.length)]}\u0001`);
});
export default async bot => {
return [{
name: "version",
listener: "ctcp:version",
f: e => {
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ctcp:version ${e.message}`);
e.write(`notice ${e.user.nick} :\u0001VERSION ${versions[~~(Math.random() * versions.length)]}\u0001`);
}
}, {
name: "ping",
listener: "ctcp:ping",
f: e => {
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ctcp:ping ${e.message}`);
e.write(`notice ${e.user.nick} :${e.message}`);
}
}];
};

12
src/inc/events/error.mjs Normal file
View File

@ -0,0 +1,12 @@
import logger from "../log.mjs";
export default async bot => {
return [{
name: "error",
listener: "error",
f: e => {
logger.error(e);
}
}];
};

View File

@ -1,6 +0,0 @@
import ctcp from "./ctcp";
import message from "./message";
export default [
ctcp, message
];

18
src/inc/events/info.mjs Normal file
View File

@ -0,0 +1,18 @@
import logger from "../log.mjs";
export default async bot => {
return [{
name: "info",
listener: "info",
f: e => {
logger.debug(e);
}
}, {
name: "debug",
listener: "debug",
f: e => {
logger.debug(e);
}
}];
};

View File

@ -1,44 +1,42 @@
import { getLevel } from "../admin";
import logger from "../log.mjs";
import { getLevel } from "../../inc/admin.mjs";
const parseArgs = msg => {
let args = msg.trim().split(" ");
let cmd = args.shift();
let args = msg.trim().split(" ")
, cmd = args.shift();
return {
cmd: cmd.replace(/^(\.|\/|\!)/, ""),
args: args
};
};
export default self => {
self.bot.on("message", e => {
for (var [name, trigger] of self._trigger.entries()) {
if (!trigger.call.exec(e.message))
continue;
if (!trigger.clients.includes(e.type))
continue;
export default async bot => {
/*let active = false;
if (e.type === "irc" && cfg.trigger[e.network + e.channel]) {
if (cfg.trigger[e.network + e.channel].val[trigger.name])
active = true;
}
else
active = trigger.active;*/
return [{
name: "message",
listener: "message",
f: e => {
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${e.message}`);
//if (!active)
// continue;
const trigger = [...bot._trigger.entries()].filter(t =>
t[1].call.exec(e.message) &&
t[1].clients.includes(e.type) &&
t[1].active &&
t[1].level <= getLevel(e.network, e.user).level &&
!((e.self.set !== "all" && e.self.set !== t[1].set) && t[1].set !== "all")
);
if ((e.self.set !== "all" && e.self.set !== trigger.set) && trigger.set !== "all")
continue;
if (trigger.level > getLevel(e.network, e.user)) {
e.reply(`no permission, min level ${trigger.level} required`);
break;
}
e = Object.assign(e, parseArgs(e.message));
trigger.f(e);
trigger.forEach(async t => {
try {
await t[1].f({ ...e, ...parseArgs(e.message) });
console.log(`triggered > ${t[0]}`);
}
catch(error) {
e.reply(`${t[0]}: An error occured.`);
logger.error(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${error.toString ? error : JSON.stringify(error)}`);
}
});
}
console.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${e.message}`);
});
}];
};

View File

@ -1,35 +0,0 @@
import http from "http";
import https from "https";
import url from "url";
import querystring from "querystring";
const readdata = (res, mode, data = "") => new Promise((resolve, reject) => res
.setEncoding("utf8")
.on("data", chunk => data += chunk)
.on("end", () => {
switch(mode) {
case "text": resolve(data); break;
case "json": try { resolve(JSON.parse(data)); } catch(err) { reject("no json D:"); } break;
case "buffer": resolve(new Buffer.from(data)); break;
default: reject("lol no"); break;
}
}));
export default (a, options = {}, link = url.parse(a), body = "") => new Promise((resolve, reject) => {
options = {...{ hostname: link.hostname, path: link.path, method: "GET" }, ...options};
if(options.method === "POST") {
body = querystring.stringify(options.body);
delete options.body;
options.headers = {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": Buffer.byteLength(body)
};
}
(link.protocol === "https:"?https:http).request(options, res => resolve({
body: res,
headers: res.headers,
text: () => readdata(res, "text"),
json: () => readdata(res, "json"),
buffer: () => readdata(res, "buffer")
})).on("error", err => reject(err)).end(body);
});

15
src/inc/log.mjs Normal file
View File

@ -0,0 +1,15 @@
import fs from "fs";
const logger = ["debug", "info", "error"];
const logfiles = logger.reduce((a, b) => ({...a, [b]: fs.createWriteStream(`./logs/${~~(Date.now() / 1000)}_${b}.log`)}), {});
export default new Proxy({}, {
get: (_, prop) => (msg, timestamp = new Date().toLocaleString()) =>
logger.includes(prop) &&
logfiles[prop].write(JSON.stringify({
level: prop,
message: msg,
timestamp: timestamp
}) + "\n") &&
console.log(timestamp, prop, msg)
});

View File

@ -1,4 +1,8 @@
class Router {
import { promises as fs } from "fs";
import path from "path";
export default new class Router {
#mimes;
constructor() {
this.routes = new Map();
};
@ -12,11 +16,32 @@ class Router {
post() {
this.route("POST", arguments);
};
async static({ dir = path.resolve() + "/public", route = /^\/public/ }) {
if(!this.#mimes) {
this.#mimes = new Map();
(await fs.readFile("/etc/mime.types", "utf-8"))
.split("\n")
.filter(e => !e.startsWith("#") && e)
.map(e => e.split(/\s{2,}/))
.filter(e => e.length > 1)
.forEach(m => m[1].split(" ").forEach(ext => this.#mimes.set(ext, m[0])));
}
this.get(route, async (req, res) => {
try {
return res.reply({
type: this.#mimes.get(req.url.path.split(".").pop()).toLowerCase(),
body: await fs.readFile(path.join(dir, req.url.path.replace(route, "")))
});
} catch {
return res.reply({
code: 404,
body: "404 - file not found"
});
}
});
};
};
const router = new Router();
export default router;
export const routes = router.routes;
Map.prototype.getRegex = function(path, method, tmp) {
return (!(tmp = [...this.entries()].filter(r => r[0].exec(path) && r[1].method.includes(method))[0])) ? false : tmp[1].f;
Map.prototype.getRoute = function(path, method, tmp) {
return (!(tmp = [...this.entries()].filter(r => ( r[0] === path || r[0].exec?.(path) ) && r[1].method.includes(method) )[0])) ? false : tmp[1].f;
};

View File

@ -1,16 +1,15 @@
import router from "../router";
import sql from "../sql";
import router from "../router.mjs";
import sql from "../sql.mjs";
import { parse } from "url";
import cfg from "../../../config.json";
import { mimes, queries } from "./inc/api";
import { mimes, queries } from "./inc/api.mjs";
router.get(/^\/api$/, (req, res) => {
router.get("/api", (req, res) => {
res.end("api lol");
});
router.get(/^\/api\/random(\/user\/.+|\/image|\/video|\/audio)?$/, async (req, res) => {
const db = await sql.getConnection();
const args = [];
let q = queries.random.main;
@ -22,26 +21,24 @@ router.get(/^\/api\/random(\/user\/.+|\/image|\/video|\/audio)?$/, async (req, r
q += queries.random.where(mimes[req.url.split[2]] ? mimes[req.url.split[2]].map(mime => `mime = "${mime}"`).join(" or ") : null);
try {
const rows = await db.query(q, args);
const rows = await sql.query(q, args);
res
.writeHead(200, { 'Content-Type': 'application/json' })
.end(JSON.stringify(rows.length > 0 ? rows[0] : []), 'utf-8');
.writeHead(200, { "Content-Type": "application/json" })
.end(JSON.stringify(rows.length > 0 ? rows[0] : []), "utf-8");
} catch(err) {
res
.writeHead(500)
.end(JSON.stringify(err), 'utf-8');
.end(JSON.stringify(err), "utf-8");
}
db.end();
});
router.get(/^\/api\/p$/, async (req, res) => {
const db = await sql.getConnection();
router.get("/api/p", async (req, res) => {
let id = parseInt(req.url.qs.id) || 99999999;
const eps = Math.min(parseInt(req.url.qs.eps) || 100, 200);
let [ order, trend ] = req.url.qs.order === "asc" ? [ "asc", ">" ] : [ "desc", "<" ];
try {
const tmp = (await db.query("select min(id) as min, max(id) as max from items limit 1"))[0];
const tmp = (await sql.query("select min(id) as min, max(id) as max from items limit 1"))[0];
if((id - 1 + eps) > tmp.max) {
id = tmp.max;
[ order, trend ] = [ "desc", "<=" ];
@ -51,7 +48,7 @@ router.get(/^\/api\/p$/, async (req, res) => {
[ order, trend ] = [ "asc", ">=" ];
}
const rows = await db.query(queries.p(trend, order), [ id, eps ]);
const rows = await sql.query(queries.p(trend, order), [ id, eps ]);
const items = {
items: rows,
first: rows[0].id,
@ -60,21 +57,33 @@ router.get(/^\/api\/p$/, async (req, res) => {
oldest: tmp.min
};
res
.writeHead(200, { 'Content-Type': 'application/json' })
.end(JSON.stringify(items), 'utf-8');
.writeHead(200, { "Content-Type": "application/json" })
.end(JSON.stringify(items), "utf-8");
} catch(err) {
console.error(err);
res
.writeHead(500)
.end(JSON.stringify(err), 'utf-8');
.end(JSON.stringify(err), "utf-8");
}
db.end();
});
router.get(/^\/api\/p\/([0-9]+)/, async (req, res) => { // legacy
let eps = 100;
let id = +req.url.split[2];
const query = await sql.query("select * from items where id < ? order by id desc limit ?", [ id, eps ]);
const items = {
items: query,
last: query[query.length - 1].id
};
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(items), "utf-8");
});
router.get(/^\/api\/item\/[0-9]+$/, async (req, res) => {
const db = await sql.getConnection();
try {
const rows = await db.query(queries.item, Array(3).fill(req.url.split[2]));
const rows = await sql.query(queries.item, Array(3).fill(req.url.split[2]));
const data = rows[0].length > 0 ? {
...rows[0][0], ...{
thumb: `${cfg.main.url}/t/${rows[0][0].id}.png`,
@ -86,29 +95,27 @@ router.get(/^\/api\/item\/[0-9]+$/, async (req, res) => {
error: true
};
res
.writeHead(200, { 'Content-Type': 'application/json' })
.end(JSON.stringify(data), 'utf-8');
.writeHead(200, { "Content-Type": "application/json" })
.end(JSON.stringify(data), "utf-8");
} catch(err) {
res
.writeHead(500)
.end(JSON.stringify(err), 'utf-8');
.end(JSON.stringify(err), "utf-8");
}
db.end();
});
router.get(/^\/api\/user\/.*(\/[0-9]+)?$/, async (req, res) => { // auf qs umstellen
const db = await sql.getConnection();
const user = req.url.split[2];
const eps = Math.min(req.url.split[3] || 50, 50);
try {
const rows = await db.query(queries.user, [ user, eps ]);
const rows = await sql.query(queries.user, [ user, eps ]);
res
.writeHead(200, { 'Content-Type': 'application/json' })
.end(JSON.stringify(rows.length > 0 ? rows : []), 'utf-8');
.writeHead(200, { "Content-Type": "application/json" })
.end(JSON.stringify(rows.length > 0 ? rows : []), "utf-8");
} catch(err) {
res
.writeHead(500)
.end(JSON.stringify(err), 'utf-8');
.end(JSON.stringify(err), "utf-8");
}
db.end();
});

View File

@ -1,10 +1,104 @@
import router from "../router";
import router from "../router.mjs";
import cfg from "../../../config.json";
import fs from "fs";
import sql from "../sql.mjs";
import swig from "swig";
import url from "url";
const tpl = fs.readFileSync("./views/index.html", "utf-8");
const templates = {
contact: fs.readFileSync("./views/contact.html", "utf-8"),
help: fs.readFileSync("./views/help.html", "utf-8"),
how: fs.readFileSync("./views/how.html", "utf-8"),
index: fs.readFileSync("./views/index.html", "utf-8"),
item: fs.readFileSync("./views/item.html", "utf-8")
};
router.get(/^\/(page\/[0-9]+)?$/, async (req, res) => {
res
.writeHead(200, { 'Content-Type': 'text/html' })
.end(tpl);
router.get("/", async (req, res) => {
const query = await sql.query("select id, mime from items order by id desc limit 300");
const data = {
items: query,
last: query[0].id
};
res.reply({
body: swig.compile(templates.index)(data)
});
});
router.get(/^\/([0-9]+)$/, async (req, res) => {
const q = "select * from items where id = ? limit 1; " // get item
+ "select id from items where id = (select min(id) from items where id > ?); " // get previous item
+ "select id from items where id = (select max(id) from items where id < ?)"; // get next item
const query = await sql.query(q, [req.url.split[0], req.url.split[0], req.url.split[0]]);
const data = {
id: '',
username: '',
item: '',
src: '',
dest: '',
mime: '',
size: '',
userchannel: '',
usernetwork: '',
thumb: null,
thumbnail: null,
next: null,
prev: null
};
if(query[0][0]) {
const e = query[0][0];
switch(e.mime) {
case "image/png":
case "image/jpeg":
case "image/gif":
data.item = "image";
break;
case "video/webm":
case "video/mp4":
case "video/quicktime":
data.item = "video";
break;
case "audio/mpeg":
case "audio/ogg":
case "audio/flac":
case "audio/x-flac":
data.item = "audio";
break;
}
data.id = e.id;
data.username = e.username;
data.srcurl = e.src;
data.src = url.parse(e.src).hostname;
data.thumb = `${cfg.websrv.paths.thumbnails}/${e.id}.png`;
data.dest = `${cfg.websrv.paths.images}/${e.dest}`;
data.mime = e.mime;
data.size = e.size;//lib.formatSize(e.size);
data.userchannel = e.userchannel;
data.usernetwork = e.usernetwork;
data.timestamp = new Date(e.stamp * 1000).toISOString();
if(query[1].length)
data.next = query[1][0].id;
if(query[2].length)
data.prev = query[2][0].id;
}
res.reply({
body: swig.compile(templates.item)(data)
});
});
router.get(/^\/(contact|help|how)$/, (req, res) => {
res.reply({
body: templates[req.url.split[0]]
});
});
router.get("/random", async (req, res) => {
res
.writeHead(301, {
"Cache-Control": "no-cache, public",
"Location": "/" + (await sql.query("select id from items order by rand() limit 1"))[0].id
})
.end();
});

17
src/inc/routes/static.mjs Normal file
View File

@ -0,0 +1,17 @@
import path from "path";
import router from "../router.mjs";
router.static({
dir: path.resolve() + "/public/b",
route: /^\/b\//
});
router.static({
dir: path.resolve() + "/public/s",
route: /^\/s\//
});
router.static({
dir: path.resolve() + "/public/t",
route: /^\/t\//
});

View File

@ -1,35 +1,51 @@
import { admins } from "../admin";
import { getLevel } from "../admin.mjs";
import fetch from "flumm-fetch-cookies";
import vm from "vm";
const maxoutput = 1000;
let maxoutput = 750;
let context = vm.createContext({
e: null,
bot: null,
admins: null,
fetch: fetch
});
export default bot => bot._trigger.set("sandbox_debug", new bot.trigger({
call: /^\!debug (.*)/i,
level: 100,
active: true,
f: e => {
const args = e.message.trim().substring(7);
if(args === "true" || args === "false")
return e.self.debug = !e.self.debug;
try {
context.admins = admins;
context.e = e;
context.bot = bot;
let output = vm.runInContext(args, vm.createContext(context));
if (typeof output !== undefined && output) {
output = JSON.stringify(output);
return r.reply(output.length > maxoutput ? `holy fuck, Ausgabe wäre viel zu lang! (${output.length} Zeichen :DDDDDD)` : output);
}
else
e.reply("false lol");
export default async bot => {
return [{
name: "level",
call: /^!level (.*)/i,
active: true,
f: e => {
const user = e.message.trim().substring(7);
e.reply( JSON.stringify( getLevel( e.self.user.get(user) || {} ) ) );
}
catch (err) {
e.reply(err.message);
}, {
name: "sandbox_debug",
call: /^\!debug (.*)/i,
active: true,
level: 100,
f: e => {
const args = e.message.trim().substring(7);
try {
context.e = e;
context.bot = bot;
context.level = getLevel;
let output = vm.runInContext(args, vm.createContext(context));
if (typeof output !== undefined && output) {
output = JSON.stringify(output);
if (output.length > maxoutput)
return e.reply(`holy fuck, Ausgabe wäre viel zu lang! (${output.length} Zeichen :DDDDDD)`);
else
e.reply(output);
}
else
e.reply("false lol");
}
catch (err) {
e.reply(err.message);
}
}
}
}));
}];
};

View File

@ -1,3 +0,0 @@
import debug from "./debug";
export default [ debug ];

View File

@ -1,28 +1,51 @@
import cfg from "../config.json";
import { cuffeo } from "cuffeo";
import cuffeo from "cuffeo";
import { promises as fs } from "fs";
import triggers from "./inc/trigger";
import events from "./inc/events";
import "./websrv";
import "./websrv.mjs";
(async () => {
// Chatbots
/*const self = {
const self = {
_trigger: new Map(),
trigger: function trigger(args) {
this.call = args.call;
this.help = args.help || false;
this.level = args.level || 0;
this.active = args.hasOwnProperty("active") ? args.active : true;
this.set = args.set || "all"; // uwe, nxy, f0ck, all
this.clients = args.clients || ["irc", "tg"];
this.clients = args.clients || [ "irc", "tg", "slack" ];
this.f = args.f;
},
bot: new cuffeo(cfg.clients)
bot: await new cuffeo(cfg.clients)
};
triggers.forEach(mod => mod(self));
events.forEach(event => event(self));*/
//
console.time("loading");
const modules = {
events: (await fs.readdir("./src/inc/events")).filter(f => f.endsWith(".mjs")),
trigger: (await fs.readdir("./src/inc/trigger")).filter(f => f.endsWith(".mjs"))
};
console.timeLog("loading", "directories");
const blah = (await Promise.all(Object.entries(modules).map(async ([dir, mods]) => ({
[dir]: (await Promise.all(mods.map(async mod => {
const res = await Promise.race([
(await import(`./inc/${dir}/${mod}`)).default(self),
new Promise((_, rej) => setTimeout(() => rej(false), timeout))
]);
console.timeLog("loading", `${dir}/${mod}`);
return res;
}))).flat(2)
})))).reduce((a, b) => ({...a, ...b}));
blah.events.forEach(event => {
console.timeLog("loading", `registering event > ${event.name}`);
self.bot.on(event.listener, event.f);
});
blah.trigger.forEach(trigger => {
console.timeLog("loading", `registering trigger > ${trigger.name}`);
self._trigger.set(trigger.name, new self.trigger(trigger));
});
console.timeEnd("loading");
})();

View File

@ -2,19 +2,30 @@ import http from "http";
import url from "url";
import querystring from "querystring";
import cfg from "../config.json";
import router from "./inc/router.mjs";
// routes
import "./inc/routes/index";
import "./inc/routes/api";
import "./inc/routes/index.mjs";
import "./inc/routes/api.mjs";
import "./inc/routes/static.mjs";
import { routes } from "./inc/router";
http.createServer((req, res, r) => {
http.createServer(async (req, res, r) => {
req.url = url.parse(req.url.replace(/(?!^.)(\/+)?$/, ''));
req.url.split = req.url.pathname.split("/").slice(1);
req.url.qs = querystring.parse(req.url.query);
console.log(`[${(new Date()).toLocaleTimeString()}] ${req.method} ${req.url.pathname}`);
req.post = new Promise((resolve, _, data = "") => req
.on("data", d => void (data += d))
.on("end", () => void resolve(Object.fromEntries(Object.entries(querystring.parse(data)).map(([k, v]) => [k, decodeURIComponent(v)])))));
!(r = routes.getRegex(req.url.pathname, req.method)) ? res.writeHead(404).end(`404 - ${req.url.pathname}`) : r(req, res);
}).listen(cfg.websrv.port, () => console.log(`f0ck is listening on port ${cfg.websrv.port}.`));
res.reply = ({
code = 200,
type = "text/html",
body
}) => res.writeHead(code, { "Content-Type": `${type}; charset=utf-8` }).end(body);
!(r = router.routes.getRoute(req.url.pathname, req.method)) ? res.writeHead(404).end(`404 - ${req.url.pathname}`) : await r(req, res);
console.log(`[${(new Date()).toLocaleTimeString()}] ${res.statusCode} ${req.method}\t${req.url.pathname}`);
}).listen(cfg.websrv.port, () => setTimeout(() => {
console.log(`f0ck is listening on port ${cfg.websrv.port}.`);
}, 500));

35
views/contact.html Normal file
View File

@ -0,0 +1,35 @@
<html>
<head>
<title>f0ck! I need contact!</title>
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
</head>
<body>
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="/">
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
</a>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="/random">Random</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/how">Help</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact">Contact</a>
</li>
</ul>
</div>
</nav>
<div class="container">
<div class="contact">
<p>Got a problem? We have the answer: <a href="mailto:admin@f0ck.space">admin@f0ck.space</a></p>
<a href="/">return to main</a> <span id="themes"></span>
</div>
</div>
<script src="./s/js/theme.js"></script>
</body>
</html>

61
views/help.html Normal file
View File

@ -0,0 +1,61 @@
<html>
<head>
<title>f0ck me! but how?</title>
<link rel="stylesheet" type="text/css" href="./s/css/bulma.css">
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
</a>
<a class="navbar-item" href="/random">
Random
</a>
<a class="navbar-item" href="/help">
Help
</a>
<a class="navbar-item" href="/contact">
Contact
</a>
</div>
</nav>
<div class="irc">
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
<p>More information: <a href="https://n0xy.net">n0xy.net</a></p>
<div class="page-header">
<h4>IRC Rules</h4>
</div>
<p>Constitution:</p>
<ul>
<li>§ 1 The dignity of the IRCd is inviolable.</li>
<li>§ 2 The distribution of Child Pornography is strictly prohibited in any of our networks and will lead to an immediate ban.</li>
<li>§ 3 Do not attack users in this network in any way, shape, or form.</li>
<li>§ 4 Do not transmit any personal/financial information without permission.</li>
<li>§ 5 Do not share any malware on this network.</li>
</ul>
<p>f0ck specific rules:</p>
<ul>
<li>Animal cruelty is forbidden and will lead to an immediate ban</li>
</ul>
<h4>What the f0ck is a f0ck?</h4>
<p>A f0ck is basically giving a fuck about some internet bullshit, like stupid images, videos and so on, but also for great things like good music taste and shit, it's basically "a f0ck was given" and f0ck and it's users gave a lot of f0cks over the past years, it's not hard to finally start giving a damn f0ck about something, just f0ck.it dood!</p>
<h4>how the f0ck to f0ck, you ask?</h4>
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
<p>If you don't want f0ck to f0ck it put !ignore behind your link. Example: https://retard-journal.com/stupidshit.png !ignore</a>
<p>f0ck will only f0ck media links with the maximum size of 80MB</p>
</div>
<script src="./s/js/theme.js"></script>
</body>
</html>

67
views/how.html Normal file
View File

@ -0,0 +1,67 @@
<html>
<head>
<title>f0ck me! but how?</title>
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="/">
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
</a>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="/random">Random</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/how">Help</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact">Contact</a>
</li>
</ul>
</div>
</nav>
<div class="container">
<div class="irc">
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
<p>More information: <a href="https://n0xy.net">n0xy.net</a></p>
<div class="page-header">
<h4>IRC Rules</h4>
</div>
<p>Constitution:</p>
<ul>
<li>§ 1 The dignity of the IRCd is inviolable.</li>
<li>§ 2 The distribution of Child Pornography is strictly prohibited in any of our networks and will lead to an immediate ban.</li>
<li>§ 3 Do not attack users in this network in any way, shape, or form.</li>
<li>§ 4 Do not transmit any personal/financial information without permission.</li>
<li>§ 5 Do not share any malware on this network.</li>
</ul>
<p>f0ck specific rules:</p>
<ul>
<li>Animal cruelty is forbidden and will lead to an immediate ban</li>
</ul>
<h4>What the f0ck is a f0ck?</h4>
<p>A f0ck is basically giving a fuck about some internet bullshit, like stupid images, videos and so on, but also for great things like good music taste and shit, it's basically "a f0ck was given" and f0ck and it's users gave a lot of f0cks over the past years, it's not hard to finally start giving a damn f0ck about something, just f0ck.it dood!</p>
<h4>how the f0ck to f0ck, you ask?</h4>
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
<p>If you don't want f0ck to f0ck it put !ignore behind your link. Example: https://retard-journal.com/stupidshit.png !ignore</a>
<p>f0ck will only f0ck media links with the maximum size of 30MB for cool people 80MB</p>
<p>YouTube Links are currently not working, if you really want to f0ck them, you gotta download it yourself and reupload somewhere until this is fixed</p>
</div>
</div>
<script src="./s/js/theme.js"></script>
</body>
</html>

View File

@ -1,85 +1,45 @@
<!doctype blah>
<html lang="en">
<!DOCTYPE f0ck>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=0.7, shrink-to-fit=no, user-scalable=no">
<meta name="description" content="f0ck you">
<meta name="author" content="Abu Ottermann, Flummi Mc Doggerstein">
<title>f0ck lol!</title>
<link rel="stylesheet" href="/css/f0ck.css">
<link rel="stylesheet" href="/css/icons.css">
<link rel="stylesheet" href="/css/pageview.css">
<link rel="stylesheet" href="/css/itemview.css">
<title>f0ck!</title>
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="pageWrapper">
<div class="page" id="header">
<h1 id="logoHead"><a href="/"><img id="logo" src="/img/f0ckv2_logo_test_v1.5.png"></a></h1>
<div id="itemInfo">
<div class="infoText">
<span id="itemTitle">blah</span> //
<a id="itemSource" href=""></a>
</div>
<div class="infoText">
<span id="itemTime" time=""></span> by
<span id="itemNick">blah</span> on
<span id="itemChannel">#f0ck</span>
</div>
<span id="debug">
<a>random</a>
</span>
</div>
<div class="itemNumber">
<div id="pagePosition"></div>
<div id="itemPosition">
</div>
</div>
</div>
<div class="page" id="content">
<div class="wrapper" id="pagewrapper">
<div class="arrow top" id="up"></div>
<div id="p_items">
<div class="p_item">Seite 1</div>
<div class="p_item">Seite 2</div>
<div class="p_item">Seite 3</div>
</div>
<div class="arrow bottom" id="down"></div>
</div>
<div class="wrapper" id="itemwrapper">
<div class="arrow left" id="left"></div>
<div id="i_items">
<div class="i_item">Item 1</div>
<div class="i_item">Item 2</div>
<div class="i_item">Item 3</div>
</div>
<div class="arrow right" id="right"></div>
<div class="close"></div>
</div>
<div class="wrapper" id="howtowrapper">
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
<p>More information: <a href="https://n0xy.net">n0xy.net</a></p>
<div class="page-header"><h4>IRC Rules</h4></div>
<p>Constitution:</p>
<ul>
<li>§ 1 The dignity of the IRCd is inviolable.</li>
<li>§ 2 The distribution of Child Pornography is strictly prohibited in any of our networks and will lead to an immediate ban.</li>
<li>§ 3 Do not attack users in this network in any way, shape, or form.</li>
<li>§ 4 Do not transmit any personal/financial information without permission.</li>
<li>§ 5 Do not share any malware on this network.</li>
</ul>
<p>f0ck specific rules:</p>
<ul>
<li>Animal cruelty is forbidden and will lead to an immediate ban</li>
</ul>
<h4>how the f0ck to f0ck, you ask?</h4>
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
<p>If you don't want f0ck to f0ck it put !ignore behind your link. Example: https://retard-journal.com/stupidshit.png !ignore</a>
<p>f0ck will only f0ck media links with the maximum size of 80MB</p>
</div>
</div>
<div class="page" id="footer">Made with 666 souls in mind and 2 liters of fresh virgin blood
</div>
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="/">
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
</a>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" id="random" href="/random"><span class="rndtext">Random</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="/how">Help</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact">Contact</a>
</li>
</ul>
</div>
<script src="/js/f0ck.js" type="module" defer></script>
</nav>
<div class="container-fluid">
<ul id="posts" data-last="{{ last }}">
{% for item in items %}
<li class="post"><a href="/{{ item.id }}" title="{{ item.mime }}">
<img class="thumb" src="/t/{{ item.id }}.png" />
<span class="item-mime">{{ item.mime }}</span>
</a>
</li>
{% endfor %}
</ul>
</div>
<script src="./s/js/scroller.js"></script>
<script src="./s/js/theme.js"></script>
</body>
</html>

144
views/item.html Normal file
View File

@ -0,0 +1,144 @@
<!doctype f0ck>
<html>
<head>
<title>{{ id }} - f0ck.me</title>
<link rel="stylesheet" type="text/css" href="./s/css/video-js.min.css" />
<link rel="stylesheet" type="text/css" href="./s/css/vsg-skin.css" />
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
<meta property="og:site_name" content="f0ck.me" />
<meta property="og:description" content="f0cked by {{ username }}" />
<meta name="Description" content="f0cked by {{ username }}" />
<meta property="og:image" content="{{ thumbnail }}" />
<meta charset="utf-8" />
</head>
<body>
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="/">
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
</a>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" id="random" href="/random"><span class="rndtext">Random</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="/how"><span class="hlptext">Help</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact"><span class="cnttext">Contact</span></a>
</li>
</ul>
</div>
</nav>
<div class="container">
<div class="controls">
<a id="rndbtn" href="/random">Random</a>
</div>
<div class="content">
<div class="next-post">
{% if next != null %}
<a id="next" href="/{{ next }}">«</a>
{% else %}
<a id="next" href="#" style="color: #ccc !important;">«</a>
{% endif %}
</div>
<div class="media-object">
{% if item == "video" %}
<div class="embed-responsive embed-responsive-16by9">
<video id="my-video" class="video-js embed-responsive-item" width="640" height="360" src="{{ dest }}" preload="auto" autoplay controls loop data-setup="{}"></video>
</div>
{% elseif item == "audio" %}
{% if thumb != null %}
<div>
<!-- <img src="{{ thumb }}" /><br /> -->
{% endif %}
<div class="embed-responsive embed-responsive-16by9">
<audio id="my-video" class="embed-responsive-item video-js audiojs" autoplay controls loop src="{{ dest }}" data-setup="{}" poster="{% if thumb !== null %}{{ thumb }}{% else %}/s/200.gif{% endif %}" type="audio/mp3" ></audio>
</div>
{% if thumb != null %}
</div>
{% endif %}
{% elseif item == "image" %}
<a href="{{ dest }}" id="elfe" target="_blank"><img id="f0ck-image" src="{{ dest }}" /></a>
{% else %}
<h1>404 - Not f0cked</h1>
{% endif %}
</div>
<div class="previous-post">
{% if prev != null %}
<a id="prev" href="/{{ prev }}">»</a>
{% else %}
<a id="prev" href="#" style="color: #ccc !important;">»</a>
{% endif %}
</div>
</div>
<div class="metadata">
<span class="badge badge-dark"><a href="/{{ id }}" class="id-link">{{ id }} </a> by {{ username }}</span>
<span class="badge badge-dark">{{ usernetwork }} / {{ userchannel }}</span>
<span class="badge badge-dark"><a id="post_source" href="{{ srcurl }}" target="_blank">{{ src }}</a></span>
<span class="badge badge-dark">{{ size }}</span>
<span class="badge badge-dark"><time class="timeago" title="{{ timestamp }}" datetime="{{ timestamp }}"> </time></span>
<span class="badge badge-dark" id="themes"></span>
</div>
</div>
<script src="./s/js/shit.js"></script>
<script src="./s/js/theme.js"></script>
<script src="./s/js/video.min.js"></script>
<script src="./s/js/videojs.persistvolume.js"></script>
<script>
(function() {
let video = document.querySelector(".video-js");
if(!video)
return;
var vid1 = videojs(video);
vid1.persistvolume({
namespace: "f0ck"
});
if(vid1.autoplay() && !vid1.paused() && vid1.hasClass('vjs-paused')) {
vid1.pause();
vid1.play();
}
})();
const epochs = [
["year", 31536000],
["month", 2592000],
["day", 86400],
["hour", 3600],
["minute", 60],
["second", 1]
];
const getDuration = timeAgoInSeconds => {
for(let [name, seconds] of epochs) {
const interval = ~~(timeAgoInSeconds / seconds);
if (interval >= 1) {
return {
interval: interval,
epoch: name
};
}
}
};
const timeAgo = date => {
const timeAgoInSeconds = ~~((new Date() - new Date(date)) / 1000);
const {interval, epoch} = getDuration(timeAgoInSeconds);
const suffix = interval === 1 ? "" : "s";
return `${interval} ${epoch}${suffix} ago`;
};
(() => {
document.querySelectorAll("time.timeago").forEach(e => e.innerHTML = timeAgo(e.title));
})();
</script>
</body>
</html>