mirror of
https://github.com/tomoko-dev9/nntpchan.git
synced 2026-03-28 17:32:35 +01:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b1d09072c | ||
|
|
7f56d35762 | ||
|
|
3360eaf924 | ||
|
|
51041e2dc9 | ||
|
|
6e20cb270e | ||
|
|
6019d70382 | ||
|
|
cec6f7cef5 | ||
|
|
40b7e0a88b | ||
|
|
b595024585 | ||
|
|
00fbc305be | ||
|
|
5e3f2eea03 | ||
|
|
7f721eefea | ||
|
|
866196e810 | ||
|
|
8c18b4405d | ||
|
|
578d9f44b3 | ||
|
|
ab38445555 | ||
|
|
98cf765690 | ||
|
|
d742af18b5 | ||
|
|
74a1c044f0 | ||
|
|
adb3e54212 | ||
|
|
1cc4d4e858 | ||
|
|
ec8db8121f | ||
|
|
9cb8998302 | ||
|
|
2f8fd2f2b5 | ||
|
|
569727cc96 | ||
|
|
f7fc61d493 | ||
|
|
8cbf1f217d | ||
|
|
458232d402 | ||
|
|
fcfd010e5c | ||
|
|
dca5ee7561 | ||
|
|
108f05da32 | ||
|
|
a515ba9d1f | ||
|
|
8611e2e768 | ||
|
|
20dd0c215e | ||
|
|
c91c8c08b1 | ||
|
|
9321a65f1c | ||
|
|
b2a71e1877 | ||
|
|
045e3140ad | ||
|
|
d6f073943e | ||
|
|
47f884ce98 | ||
|
|
9d815479b2 | ||
|
|
2aa2405ba7 | ||
|
|
40d6cf77ad | ||
|
|
e70c4ed84e | ||
|
|
1c61de8880 | ||
|
|
8d146ed6cd | ||
|
|
9a807bbebf | ||
|
|
61fc6d076f | ||
|
|
5a2500dffc | ||
|
|
021721d21e | ||
|
|
2304d3d8fa | ||
|
|
c340d215e0 | ||
|
|
9e0029772c | ||
|
|
1663abcbec | ||
|
|
b58e582f0a | ||
|
|
1cfa104e4c | ||
|
|
dc06baba37 | ||
|
|
838bbc20cd | ||
|
|
487e392d76 | ||
|
|
90276293e1 | ||
|
|
8411568530 | ||
|
|
de51b912ff | ||
|
|
8b206740f8 | ||
|
|
be7e510519 | ||
|
|
abefe50eb6 | ||
|
|
fb06097557 | ||
|
|
7ba0e728af | ||
|
|
f9ea948071 | ||
|
|
a2fd94a83e | ||
|
|
fd1193f73a | ||
|
|
64cd178b2a | ||
|
|
fffd5beea5 | ||
|
|
4b56272fdd | ||
|
|
1f346b9da7 | ||
|
|
cb5f7f2453 |
@@ -1,6 +1,6 @@
|
||||
# NNTPChan #
|
||||
|
||||
NNTPChan (previously known as overchan) is a decentralized imageboard that uses nntp to synchronize content between many different servers. It utilizes cryptograpghicly signed posts to perform optional/opt-in decentralized moderation.
|
||||
NNTPChan (previously known as overchan) is a decentralized imageboard that uses nntp to synchronize content between many different servers. It utilizes cryptographically signed posts to perform optional/opt-in decentralized moderation.
|
||||
|
||||
This repository contains resources used by the core daemon which is located [here](https://github.com/majestrate/srndv2) along with general documentation, [here](doc/)
|
||||
|
||||
@@ -10,7 +10,9 @@ After you [built and installed the daemon](doc/build.md) and [set up your databa
|
||||
|
||||
# clone it
|
||||
git clone https://github.com/majestrate/nntpchan ~/nntpchan
|
||||
cd ~/nntpchan
|
||||
# get the latest stable release
|
||||
cd ~/nntpchan/
|
||||
git checkout tags/0.2.1
|
||||
|
||||
# set up the workspace
|
||||
srndv2 setup
|
||||
|
||||
BIN
contrib/static/about.mp3
Normal file
BIN
contrib/static/about.mp3
Normal file
Binary file not shown.
BIN
contrib/static/bg.png
Normal file
BIN
contrib/static/bg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 550 B |
@@ -43,5 +43,9 @@
|
||||
</p>
|
||||
<hr />
|
||||
</div>
|
||||
<audio autoplay="" loop="">
|
||||
<source src="/static/about.mp3" type="audio/mpeg">
|
||||
<embed src="/static/about.mp3">
|
||||
</audio>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
BIN
contrib/static/fieri.png
Normal file
BIN
contrib/static/fieri.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 858 KiB |
@@ -42,6 +42,36 @@ function nntpchan_unban() {
|
||||
})
|
||||
}
|
||||
|
||||
function get_board_target() {
|
||||
var e = document.getElementById("nntpchan_board_target");
|
||||
return e.value;
|
||||
}
|
||||
|
||||
function nntpchan_admin_board(method) {
|
||||
nntpchan_admin(method, {
|
||||
newsgroup: get_board_target()
|
||||
})
|
||||
}
|
||||
|
||||
function nntpchan_admin(method, param) {
|
||||
nntpchan_mod({
|
||||
name:"admin",
|
||||
parser: function(target) {
|
||||
return method;
|
||||
},
|
||||
handle: function(j) {
|
||||
if (j.result) {
|
||||
return document.createTextNode(j.result);
|
||||
} else {
|
||||
return "nothing happened?";
|
||||
}
|
||||
},
|
||||
method: ( param && "POST" ) || "GET",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// handle delete command
|
||||
function nntpchan_delete() {
|
||||
nntpchan_mod({
|
||||
@@ -127,8 +157,14 @@ function nntpchan_mod(mod_action) {
|
||||
}
|
||||
if (mod_action.name) {
|
||||
var url = mod_action.name + "/" + target;
|
||||
ajax.open("GET", url);
|
||||
ajax.send();
|
||||
ajax.open(mod_action.method || "GET", url);
|
||||
var data = mod_action.data;
|
||||
if (data) {
|
||||
ajax.setRequestHeader("Content-type","text/json");
|
||||
ajax.send(JSON.stringify(data));
|
||||
} else {
|
||||
ajax.send();
|
||||
}
|
||||
} else {
|
||||
alert("mod action has no name");
|
||||
}
|
||||
|
||||
14
contrib/static/nntpchan.js
Normal file
14
contrib/static/nntpchan.js
Normal file
@@ -0,0 +1,14 @@
|
||||
//
|
||||
// nntpchan.js -- frontend ui niceness
|
||||
//
|
||||
|
||||
|
||||
// insert a backlink for a post given its short hash
|
||||
function nntpchan_backlink(shorthash)
|
||||
{
|
||||
var elem = document.getElementById("postform_message");
|
||||
if ( elem )
|
||||
{
|
||||
elem.value += ">>" + shorthash + "\n";
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
.thread {
|
||||
margin-right: 20px;
|
||||
margin-bottom: 1em;
|
||||
display: inline-block;
|
||||
word-wrap: break-word;
|
||||
@@ -7,7 +6,7 @@
|
||||
}
|
||||
|
||||
.frontend , .subject {
|
||||
color: #0f0d2d;
|
||||
color: #928BFF;
|
||||
}
|
||||
|
||||
.name {
|
||||
@@ -44,8 +43,16 @@ textarea {
|
||||
padding: 10px 10px;
|
||||
}
|
||||
|
||||
pre > p {
|
||||
display: block-inline;
|
||||
}
|
||||
|
||||
.reply, th, .ukko_thread_header {
|
||||
background: #d6daf0;
|
||||
background: #202331;
|
||||
}
|
||||
|
||||
tr {
|
||||
background: #202123;
|
||||
}
|
||||
|
||||
hr {
|
||||
@@ -61,11 +68,11 @@ a:hover , a:visited:hover {
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
color: #4A4AFF;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: #414383;
|
||||
color: #5E00A0;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
@@ -76,7 +83,7 @@ a:visited {
|
||||
margin-top: 0px;
|
||||
z-index: 20;
|
||||
box-shadow: 0px 1px 20px rgba(0, 0, 0, 0.15);
|
||||
background: #CFD8EF;
|
||||
background: #202331;
|
||||
color: #616383;
|
||||
|
||||
}
|
||||
@@ -101,8 +108,13 @@ th {
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
body {
|
||||
background: linear-gradient(to top, #eef2ff, #eaf1ff) repeat scroll;
|
||||
html {
|
||||
color: #ededed;
|
||||
background: #262230;
|
||||
height: 100%;
|
||||
background-attachment: fixed;
|
||||
background-position: 100% 0%;
|
||||
background-repeat: no-repeat;
|
||||
font-family: arial,helvetica,sans-serif;
|
||||
font-size: 10pt;
|
||||
margin: 0 4px;
|
||||
@@ -118,7 +130,6 @@ body {
|
||||
|
||||
.frontend {
|
||||
margin-top: 0px;
|
||||
background: #e0f0f0;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
@@ -127,23 +138,61 @@ body {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.post, .post_body {
|
||||
.post {
|
||||
display: inline;
|
||||
margin-bottom: 5px;
|
||||
|
||||
}
|
||||
|
||||
.post_body > p {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
.tripcode {
|
||||
color: #de04ef;
|
||||
}
|
||||
|
||||
@keyframes psych
|
||||
{
|
||||
0% {background-color: red; color: blue; }
|
||||
10% {background-color: yellow; color: red; }
|
||||
20% {background-color: blue; color: green; }
|
||||
30% {background-color: green; color: yellow; }
|
||||
40% {background-color: red; color: blue; }
|
||||
50% {background-color: yellow; color: green; }
|
||||
60% {background-color: blue; color: yellow; }
|
||||
70% {background-color: green; color: blue; }
|
||||
80% {background-color: red; color: green; }
|
||||
90% {background-color: yellow; color: red; }
|
||||
95% {background-color: blue; color: yellow; }
|
||||
100% {background-color: green; color: white; }
|
||||
}
|
||||
|
||||
.psy > p {
|
||||
animation: psych 2s linear infinite;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
|
||||
.memearrows {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.redtext {
|
||||
color: #d50505;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.spoiler {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.spoiler > p {
|
||||
background: black;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.spoiler:hover > p {
|
||||
background: black;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.intro {
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
@@ -160,11 +209,7 @@ body {
|
||||
max-height: 200px;
|
||||
}
|
||||
|
||||
pre > p {
|
||||
margin: 0px 0px;
|
||||
}
|
||||
|
||||
.reply , .post_body > pre , .ukko_thread_header {
|
||||
.reply, .ukko_thread_header , pre {
|
||||
padding: 7px 7px;
|
||||
border-radius: 5px;
|
||||
box-shadow: 1px 1px 3px black;
|
||||
@@ -175,8 +220,26 @@ pre > p {
|
||||
color: #d17600;
|
||||
}
|
||||
|
||||
.post_body > p {
|
||||
margin: 0px 0px;
|
||||
}
|
||||
|
||||
.post_body {
|
||||
display: inline;
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
.post {
|
||||
display: inline-block;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
#faq > div {
|
||||
margin-left: 20%;
|
||||
width: 50%;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#captcha_img {
|
||||
background: grey;
|
||||
}
|
||||
@@ -15,6 +15,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="{{board.Prefix}}static/site.css"></link>
|
||||
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
|
||||
<title>{{board.Board}}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -25,6 +25,41 @@
|
||||
<button onclick="nntpchan_unban()">unban (ip)</button>
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
<div>
|
||||
<div> board actions </div>
|
||||
<div>
|
||||
<label for="nntpchan_board_target">board name:</label>
|
||||
<input type="text" id="nntpchan_board_target" />
|
||||
</div>
|
||||
<div>
|
||||
<button onclick="nntpchan_admin_board('frontend.regen')">regenerate</button>
|
||||
</div>
|
||||
<div>
|
||||
<button onclick="nntpchan_admin_board('frontend.ban')">ban</button>
|
||||
<button onclick="nntpchan_admin_board('frontend.unban')">unban</button>
|
||||
</div>
|
||||
<div>
|
||||
<button onclick="nntpchan_admin_board('frontend.nuke')">nuke</button>
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
<div>
|
||||
<div>
|
||||
lightweight actions
|
||||
</div>
|
||||
<div>
|
||||
<button onclick="nntpchan_admin('template.reload')">reload all templates</button>
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
<div>
|
||||
<label>very load heavy actions, use with care</label>
|
||||
<div>
|
||||
<button onclick="nntpchan_admin('frontend.regen')">regenerate all pages</button>
|
||||
<button onclick="nntpchan_admin('thumbnail.regen', {threads:1})">regenerate all thumbnails</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="nntpchan_mod_result"></div>
|
||||
<noscript>
|
||||
<b>enable js to use the mod panel kthx</b>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div class="{{{CSSClass}}}" id="post_{{PostHash}}">
|
||||
<div class="{{{CSSClass}}}" id="{{PostHash}}">
|
||||
<p class="intro">
|
||||
<label for="delete_{{PostHash}}">
|
||||
<span class="frontend">
|
||||
@@ -21,10 +21,8 @@
|
||||
{{Date}}
|
||||
</span>
|
||||
</label>
|
||||
<a href="{{PostURL}}" onclick="">No. {{ShortHash}}</a>
|
||||
{{#OP}}
|
||||
<a href="{{PostURL}}">[reply]</a>
|
||||
{{/OP}}
|
||||
<a onclick="nntpchan_backlink('{{ShortHash}}');">No. {{ShortHash}}</a>
|
||||
<a href="{{PostURL}}">[reply]</a>
|
||||
<span class="tripcode">{{{Pubkey}}}</span>
|
||||
</p>
|
||||
<div class="files">
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
Comment
|
||||
</th>
|
||||
<td>
|
||||
<textarea type="text" name="message" cols=40 rows=5></textarea>
|
||||
<textarea id="postform_message" type="text" name="message" cols=40 rows=5></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="{{thread.Prefix}}static/site.css"></link>
|
||||
<script type="text/javascript" src="{{thread.Prefix}}static/nntpchan.js"></script>
|
||||
<title> {{thread.OP.Subject}} </title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -9,11 +9,9 @@
|
||||
<title> ukko / overboard </title>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="{{prefix}}static/site.css"></link>
|
||||
</head>
|
||||
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="ukko-topbar">
|
||||
<a href="{{prefix}}">Front Page</a>
|
||||
</div>
|
||||
<div id="ukko_threads" class="threads_container">
|
||||
{{#threads}}
|
||||
<div class="ukko_thread_header">
|
||||
@@ -22,7 +20,7 @@
|
||||
<div class="thread" id="thread_{{OP.PostHash}}">
|
||||
<div clsss="thread_header">
|
||||
</div>
|
||||
{{{OP.RenderPost}}}
|
||||
{{{OP.Truncate.RenderPost}}}
|
||||
{{#Truncate.Replies}}
|
||||
{{{Truncate.RenderPost}}}
|
||||
<br />
|
||||
|
||||
23
contrib/tools/thumbs.sh
Executable file
23
contrib/tools/thumbs.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# shell script for regenerating thumbnails
|
||||
#
|
||||
|
||||
if [ "$1" == "" ] ; then
|
||||
echo "usage: $0 webroot_dir"
|
||||
else
|
||||
cd $1/img
|
||||
echo "regenerate missing thumbs in $(pwd)"
|
||||
find . \
|
||||
-type f \
|
||||
-regextype posix-extended \
|
||||
-iregex '.*\.(png|jpg|gif)$' \
|
||||
-not -execdir test -f '../thm/{}' \; \
|
||||
-exec echo 'generating missing thumb for {}' \; \
|
||||
-exec mogrify \
|
||||
-define jpeg:size=500x500 \
|
||||
-thumbnail '250>x250>' \
|
||||
-path '../thm/{}.jpg' \
|
||||
-strip \
|
||||
'{}' \;
|
||||
fi
|
||||
@@ -7,7 +7,8 @@
|
||||
* go 1.4 or higher
|
||||
* libsodium 1.0 or higher
|
||||
* imagemagick
|
||||
* RabbitMQ
|
||||
* ffmpegthumbnailer
|
||||
* sox
|
||||
|
||||
## debian ##
|
||||
|
||||
@@ -45,7 +46,7 @@ We'll also need to install some dependancies that come with debian:
|
||||
# as root
|
||||
|
||||
apt update
|
||||
apt install imagemagick libsodium-dev
|
||||
apt install imagemagick libsodium-dev ffmpegthumbnailer sox
|
||||
|
||||
Now build the daemon:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user