839 Commits

Author SHA1 Message Date
Jeff Becker
7b8d33826b initial neochan commit 2016-10-15 09:05:38 -04:00
Jan Verbeek
9e9a1efe06 Merge https://gitgud.io/uguu/nntpchan
Conflicts:
	build-js.sh
	build.sh
2016-10-08 14:29:46 +02:00
Jeff Becker
a5d7cb9074 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-10-08 08:12:37 -04:00
Jeff
053b5870cf Merge pull request #138 from wzeth/patch-15
Explicit notice of redis cache deprecation
2016-10-08 08:09:59 -04:00
wzeth
4ab90f3152 Explicit notice of redis cache deprecation
Users should know that redis cache is no longer valid as of SRNDv2 commit 96de42
2016-10-08 05:08:46 -04:00
Jeff Becker
dc75a3513e add js branding 2016-10-07 10:17:29 -04:00
Jeff Becker
40ceb747ae refactor structure 2016-10-07 10:06:25 -04:00
Jeff Becker
6996e3abc4 remove cuckhold pow in postform 2016-10-07 08:26:50 -04:00
Jeff Becker
5118ffb3f8 fix tomorrow.css 2016-10-07 07:36:33 -04:00
Jeff Becker
287a49f196 fix tomorrow.css 2016-10-07 07:35:06 -04:00
Jeff Becker
698ed1d42e previous commit 2016-10-07 07:34:08 -04:00
Jeff Becker
a0deb532e3 fix bloodgod.css moar 2016-10-07 07:33:03 -04:00
Jeff Becker
0e1e6201ca fix bloodgod.css 2016-10-07 07:30:29 -04:00
Jeff Becker
6ea75236fa fix post.mustache 2016-10-07 07:25:30 -04:00
Jeff Becker
61281190bb disable feature 2016-10-07 07:24:00 -04:00
Jeff Becker
2355528b46 fug 2016-10-02 20:42:45 -04:00
Jeff Becker
db5b8ec309 try fixing liveui for chrome 2016-10-02 20:36:59 -04:00
Jeff Becker
a0a0a6feca update readme 2016-10-02 09:01:58 -04:00
Jeff
787bef7625 Merge pull request #134 from wzeth/patch-13
Use more succinct postgres role creation command
2016-09-10 10:21:08 -04:00
wzeth
e57d4ea921 Use more succinct postgres role creation command
It is far less error prone to use the tools that Postgres provides to create the role and the database. This amendment also ensures the created role password is encrypted.
2016-09-10 09:34:00 -04:00
Jeff
c6c9c3f53b apply mona's css patch 2016-09-06 19:05:52 -04:00
Jeff Becker
f7eb634aa1 fix :p 2016-08-14 11:27:46 -04:00
Jeff Becker
74f07c3a6c add test file 2016-08-14 11:26:07 -04:00
Jeff Becker
95864559fb wrap post in pre tag 2016-08-02 20:03:45 -04:00
Jeff Becker
5155205e8c indent 2016-08-01 07:34:35 -04:00
Jeff Becker
d91b0d3e99 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-08-01 07:24:43 -04:00
Jeff Becker
3df355abdb update banners 2016-08-01 07:24:25 -04:00
Jeff Becker
850e5bccae fix css 2016-07-30 08:03:32 -04:00
Jeff Becker
713fe21190 comiit changes 2016-07-30 08:02:05 -04:00
Jeff
3d683ab87e Merge pull request #131 from deavmi/patch-1
Update building.md
2016-07-22 06:24:50 -04:00
Tristan B. Kildaire
a4053f0f1a Update building.md 2016-07-21 20:57:04 +02:00
Jeff
87e29cc117 Merge pull request #129 from deavmi/patch-1
Various fixes
2016-07-19 19:16:11 -04:00
Tristan B. Kildaire
c17d0fb0bb Various fixes
* Added missing period.
* Fixed typo.
2016-07-19 22:46:22 +02:00
Jeff Becker
985863deb2 add fade to post hide/unhide 2016-07-18 11:12:47 -04:00
Jeff Becker
a9d2c0425d have post hiding persist in localstorage 2016-07-18 10:44:18 -04:00
Jeff Becker
76cb2341ce add hr to post for reply hider 2016-07-18 09:59:53 -04:00
Jeff Becker
ceb6f09a3f update 2016-07-18 09:50:40 -04:00
Jeff Becker
adf3540556 * add hide-post.js
* disable cuckoo_miner.js
2016-07-18 09:49:44 -04:00
Jeff Becker
2ce8a38b0b update css 2016-07-18 08:26:41 -04:00
Jeff Becker
e62d959b0b remove title from post no 2016-07-18 08:17:48 -04:00
Jeff Becker
4216a777a3 fix name field in post.mustache 2016-07-18 08:13:27 -04:00
Jeff Becker
5873b41e00 add hr to separate post header from post body 2016-07-18 08:11:10 -04:00
Jeff Becker
14635e9472 have postreply class float right 2016-07-18 08:08:03 -04:00
Jeff Becker
422f3de11d add postreply class to div for future css 2016-07-18 08:04:58 -04:00
Jeff Becker
64b5531fed change post.mustache format to be "better" 2016-07-18 08:02:42 -04:00
Jeff Becker
17f3b25e51 fixes 2016-07-18 07:57:25 -04:00
Jeff Becker
60f0c19a9f update all 2016-07-18 07:51:15 -04:00
Jeff Becker
f4f2479b8a fix 2016-07-17 11:34:39 -04:00
Jeff Becker
3506d7f975 try fixing liveui 2016-07-17 11:28:49 -04:00
Jeff Becker
9acca366d0 livechan post via ajax not websocket 2016-07-17 11:23:15 -04:00
Jeff Becker
70fd791545 fix 2016-07-13 09:17:20 -04:00
Jeff Becker
9f3c41fb0b more theme tweaks 2016-07-13 09:16:34 -04:00
Jeff Becker
2ff6088605 fix typo 2016-07-13 09:15:39 -04:00
Jeff Becker
54644e0da2 more theme updates / unborking 2016-07-13 09:14:39 -04:00
Jeff Becker
dbd05c30c3 update dayman theme 2016-07-13 09:02:26 -04:00
Jeff Becker
587cdf4e75 fix tomorrow theme 2016-07-13 09:00:24 -04:00
Jeff Becker
76d75b260f update css for livechan 2016-07-11 14:48:33 -04:00
Jeff Becker
35ff3759f4 revert 2016-07-10 07:07:36 -04:00
Jeff Becker
671db6e483 update livechan.js 2016-07-10 07:05:19 -04:00
Jeff Becker
32566bfd84 fixes for liveui 2016-07-09 15:39:35 -04:00
Jeff Becker
4b02ad6d89 don't default to random, default to ukko 2016-07-09 14:51:31 -04:00
Jeff Becker
a5c2f8d86f update livechan for ukko view 2016-07-09 14:48:06 -04:00
Jeff Becker
6e1e7440dc update livechan css 2016-07-08 08:55:09 -04:00
Jeff Becker
0b460eeb5d fix css 2016-07-08 08:52:10 -04:00
Jeff Becker
2a32bb75d5 fix captcha css 2016-07-08 08:50:31 -04:00
Jeff Becker
cf91d8ffa5 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-07-08 08:48:10 -04:00
Jeff Becker
375713390e switch livechan.css to use dark theme 2016-07-08 08:47:46 -04:00
Jeff
f823b0e612 Merge pull request #127 from deavmi/patch-1
Update srnd.md
2016-07-07 19:29:25 -04:00
Tristan B. Kildaire
cb1821189a Update srnd.md 2016-07-07 19:04:19 +02:00
Jeff Becker
1a5862213c Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-07-06 13:37:13 -04:00
Jeff Becker
96c019324d update ukko template to point livechan link to livechan 2016-07-06 13:36:50 -04:00
Jeff
1e905b6bbf Merge pull request #126 from wzeth/patch-12
update definitions for allow_anon*
2016-07-06 12:40:45 -04:00
wzeth
7c6726b5fc update definitions for allow_anon*
I have 40% confidence this is correct :v)
2016-07-06 12:35:34 -04:00
Jeff Becker
24d18ff599 hide captcha by default 2016-07-06 08:12:56 -04:00
Jeff Becker
16d0489cd7 don't show captcha on first start 2016-07-06 08:05:31 -04:00
Jeff Becker
5875347966 focus on new threads in liveui 2016-07-06 07:59:13 -04:00
Jeff Becker
b2c1d9eb26 unscrewup reconnect 2016-07-05 20:43:36 -04:00
Jeff Becker
a0bc39aaa5 expire old convos 2016-07-05 19:22:08 -04:00
Jeff Becker
b887d07172 default to overchan.random for livechan 2016-07-05 17:46:34 -04:00
Jeff Becker
1f48c58f6b fix css for livechan file input 2016-07-05 17:39:40 -04:00
Jeff Becker
e8eec5862f lower padding for chat input widget 2016-07-05 13:09:56 -04:00
Jeff Becker
bf7213bf09 position fixed 2016-07-05 12:59:36 -04:00
Jeff Becker
b2201c4ef7 add subjects 2016-07-05 12:58:13 -04:00
Jeff Becker
a4747b9965 various fixes 2016-07-05 12:45:28 -04:00
Jeff Becker
5ec4c823fe fix css for firefox 2016-07-05 12:28:37 -04:00
Jeff Becker
00d0be952f position fixed 2016-07-05 12:19:40 -04:00
Jeff Becker
c448777fe9 update livechan template 2016-07-05 12:16:32 -04:00
Jeff Becker
30b54c17fa document -> document.body 2016-07-05 12:14:52 -04:00
Jeff Becker
e954c57da6 fix up livechan template 2016-07-05 12:13:48 -04:00
Jeff Becker
d5d30893e5 livechan fixes 2016-07-05 10:11:58 -04:00
Jeff Becker
72947dbbcc update livechan to be aware of convos 2016-07-05 09:53:23 -04:00
Jeff Becker
1c632666ab update livechan 2016-07-05 08:17:19 -04:00
Jeff Becker
5cf12f37a5 meh this should work for livechan ui 2016-07-04 15:48:40 -04:00
Jeff Becker
9c038021b5 update rollover in livechan 2016-07-04 12:50:00 -04:00
Jeff Becker
4a8861761d update livechan to allow attachments 2016-07-04 11:52:43 -04:00
Jeff Becker
13e0010419 update rollover in livechan ui 2016-07-04 11:28:10 -04:00
Jeff Becker
e461462bd6 actually fix thumbnails 2016-07-04 10:43:08 -04:00
Jeff Becker
8101e67b10 fix thumbnailing 2016-07-04 10:40:09 -04:00
Jeff Becker
63edd14243 fix date error 2016-07-04 10:36:10 -04:00
Jeff Becker
d2142f7c83 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-07-04 10:13:52 -04:00
Jeff Becker
28b1864841 add new livechan ui 2016-07-04 10:12:03 -04:00
Jeff
5fa1e76971 Merge pull request #125 from wzeth/patch-11
document archive in [nntp]
2016-07-04 07:16:14 -04:00
wzeth
40eeb116de document archive in [nntp] 2016-07-04 02:27:56 -04:00
ring
a502259ba9 Quote variables, remove trailing whitespace
If you don't quote your variables the scripts get very buggy if you run
them with arguments with spaces in them, or even run them from a
directory with spaces in its path.
2016-07-02 23:30:03 +02:00
Jeff
cac18a5e44 Merge pull request #124 from deavmi/master
Update README.md
2016-07-02 08:32:25 -04:00
Tristan B. Kildaire
c86f573440 Update README.md 2016-07-02 14:15:59 +02:00
Jeff Becker
6f5130d8fd Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-06-30 09:01:31 -04:00
Jeff Becker
17b8101349 update livechan.js and stylesheets 2016-06-30 09:01:11 -04:00
Jeff
5e53ae6f04 Merge pull request #122 from deavmi/patch-1
Can I put this here?
2016-06-30 06:50:12 -04:00
Tristan B. Kildaire
50c395aad4 Update TODO.md 2016-06-30 12:48:05 +02:00
Jeff
18bf12e556 Merge pull request #118 from deavmi/patch-2
Create thunderbird-newsreader-configuration.md
2016-06-30 06:46:19 -04:00
Jeff
bc1c038468 Merge pull request #117 from deavmi/patch-1
Create pan-newsreader-configuration.md
2016-06-30 06:46:08 -04:00
Jeff
7117a25f9a Merge pull request #116 from deavmi/patch-3
Update configure-newsreader.md
2016-06-30 06:45:50 -04:00
Jeff
ef69bda0d7 Merge pull request #120 from deavmi/patch-5
Update README.md
2016-06-30 06:45:36 -04:00
Jeff
ab6ac43851 Merge pull request #121 from deavmi/patch-6
Update README.md
2016-06-30 06:45:28 -04:00
Jeff
28feb5a84e Merge pull request #119 from deavmi/patch-4
Update fr-FR.ini
2016-06-30 06:44:26 -04:00
Tristan B. Kildaire
9e3e0cc443 Update README.md 2016-06-30 11:40:19 +02:00
Tristan B. Kildaire
c573fb646b Update README.md 2016-06-30 11:37:47 +02:00
Tristan B. Kildaire
93b3e0f83f Update fr-FR.ini 2016-06-30 11:35:23 +02:00
Tristan B. Kildaire
7dda235ab1 Update configure-newsreader.md 2016-06-30 11:32:39 +02:00
Tristan B. Kildaire
09e7969479 Create thunderbird-newsreader-configuration.md 2016-06-30 11:32:37 +02:00
Tristan B. Kildaire
cb37a45b67 Create pan-newsreader-configuration.md 2016-06-30 11:32:36 +02:00
Jeff Becker
e25d6ab370 remove unneeded css rule 2016-06-20 15:11:05 -04:00
Jeff Becker
e2194d3fbd fix css so that inline expand of images works 2016-06-20 13:05:36 -04:00
Jeff
fdc4234d08 Merge pull request #113 from wzeth/patch-9
document feeds.d
2016-06-20 12:58:06 -04:00
wzeth
0c0160da6d Update srnd.md 2016-06-20 11:21:46 -04:00
wzeth
fd82218e5f doucment feeds.d 2016-06-20 11:18:19 -04:00
Jeff Becker
091d74af52 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-06-20 09:38:10 -04:00
Jeff Becker
e690b7dd9c add feeds.d directory 2016-06-20 09:37:57 -04:00
Jeff
a856af693f Merge pull request #112 from wzeth/patch-8
document SRND_FEEDS_INI_PATH environment variable
2016-06-20 07:47:24 -04:00
Jeff
3668eb7822 Merge pull request #111 from wzeth/patch-7
document SRND_INI_PATH environment variable
2016-06-20 07:47:09 -04:00
wzeth
3cc04a6cad document SRND_FEEDS_INI_PATH environment variable 2016-06-20 10:09:24 +00:00
wzeth
e6967a75e7 document custom config locations 2016-06-20 09:59:03 +00:00
Jeff
679ee50342 Merge pull request #109 from wzeth/patch-6
clarified anon_nntp and pprof
2016-06-19 07:00:18 -04:00
wzeth
b73c219e6b clarified anon_nntp and pprof 2016-06-19 01:12:33 -04:00
Jeff
1b474af875 Merge pull request #108 from wzeth/patch-5
document frontend minimize_html feature
2016-06-17 11:09:28 -04:00
wzeth
77a72c5770 document frontend minimize_html feature 2016-06-17 12:51:00 +00:00
Jeff Becker
a52fe21743 add id='current_theme' to fix board list css themes not applying 2016-06-16 16:18:59 -04:00
Jeff Becker
42c70990a0 update bloodgod.css, thanks ano^ 2016-06-16 16:12:54 -04:00
Jeff
0980903b6e Merge pull request #106 from wzeth/patch-4
Debian 8.5 install guide
2016-06-15 08:44:17 -04:00
wzeth
47737dd205 Update building-debian8.5.md
set a title and backtick some directories and commands
2016-06-15 10:33:10 +00:00
wzeth
a22330f920 added links to the setup guide 2016-06-15 10:30:51 +00:00
wzeth
05b4695398 Update and rename debian8.5-step-by-step.md to building-debian8.5.md
Made things a little more concise. I removed ffmpeg in favor of libav-tools because it is available in the default repositories.
2016-06-15 10:19:43 +00:00
Jeff Becker
415fb3c4a8 merge 2016-06-14 22:37:41 -04:00
Jeff Becker
5138c31e58 update node list 2016-06-14 22:37:22 -04:00
Jeff
052259c9d1 Merge pull request #105 from wzeth/patch-3
add missing command
2016-06-13 11:47:11 -04:00
wzeth
7276e28bb7 add missing command 2016-06-13 02:21:57 -04:00
Jeff Becker
2adf2d5127 update 2016-06-12 14:19:07 -04:00
Jeff Becker
242094193f fix typo 2016-06-12 13:55:07 -04:00
Jeff Becker
2ffc7a80e6 update css 2016-06-12 13:54:31 -04:00
Jeff Becker
3da1ab157d update css 2016-06-12 13:52:24 -04:00
Jeff Becker
17d2654f26 update css 2016-06-12 13:50:38 -04:00
Jeff Becker
f155b0e9a1 update style 2016-06-12 13:46:28 -04:00
Jeff Becker
c97296700f include gchan.xyz in node list 2016-06-12 12:38:08 -04:00
Jeff
3951432bad Merge pull request #104 from wzeth/patch-2
Step-by-step for Debian 8.5
2016-06-12 08:25:08 -04:00
Jeff
da5c44d4fd Merge pull request #103 from wzeth/patch-1
SystemD Service
2016-06-12 08:24:59 -04:00
wzeth
a35889ca18 Step-by-step for Debian 8.5
This will help users with a step-by-step guide to installing. I will try to make this into a script or something one day.
2016-06-12 06:27:53 -04:00
wzeth
c171e62d52 oops made a typo 2016-06-12 05:37:19 -04:00
wzeth
75a3cf5ede systemd service file for nntpchan
Assumptions made:
1. The user has a redis_6379.service
2. The user is using /opt/nntpchan as the working directory for the srndv2
2016-06-12 05:36:05 -04:00
wzeth
2d25b349f7 Oops wrong dir 2016-06-12 05:34:59 -04:00
wzeth
29149eb452 Systemd service file
Here is an example systemd config.

It makes some assumptions:
1. The user has a systemd service called redis_6379.service (the redis install utils have this as default).
2. srndv2 is contained in /opt/nntpchan
2016-06-12 05:29:43 -04:00
Jeff
57232aeaf0 Merge pull request #102 from deavmi/patch-1
Previous link was broken but I have a new link.
2016-06-10 17:53:05 -04:00
Tristan B. Kildaire
2ced2b73c7 Previous link was broken but I have a new link. 2016-06-10 20:45:36 +02:00
Jeff
0dce01cd6d Merge pull request #101 from deavmi/patch-1
Bug fix.
2016-06-09 11:12:10 -04:00
Tristan B. Kildaire
5d05f62db5 Bug fix. 2016-06-09 07:17:53 +02:00
Jeff Becker
fe9de25dcd remove .trash directory 2016-06-05 15:48:11 -04:00
Jeff
2c2bfce762 Merge pull request #100 from deavmi/master
Minor imporvements
2016-06-05 14:47:05 -04:00
Tristan B. Kildaire (Mobile)
68bc36c0db 2016-06-05 17:53:47 +02:00
Jeff
5c353e94f0 Merge pull request #97 from deavmi/patch-2
Update README.md
2016-06-05 08:01:31 -04:00
Tristan B. Kildaire
d1d2ade366 Update README.md 2016-06-05 14:00:41 +02:00
Jeff
a007f314e8 Merge pull request #95 from deavmi/master
Getting things ready for #primetime - Documentation Bulk Fixes 1
2016-06-05 08:00:10 -04:00
Tristan B. Kildaire
9728cf697b Update .gitignore 2016-06-05 13:59:18 +02:00
Tristan B. Kildaire
67cd4ab112 Update configure-postgres.md 2016-06-05 13:37:22 +02:00
Tristan B. Kildaire
435bfa17d5 Rename install-and-configure-postgres.md to configure-postgres.md 2016-06-05 13:32:04 +02:00
Tristan B. Kildaire
b9373e44a1 Update setting-up.md 2016-06-05 13:31:46 +02:00
Tristan B. Kildaire
00153e3957 Rename install-and-configure-redis.md to configure-redis.md 2016-06-05 13:30:58 +02:00
Tristan B. Kildaire
588e19e93c Update install-and-configure-redis.md 2016-06-05 13:30:26 +02:00
Tristan B. Kildaire
e9592b6021 Create Configuring Redis database 2016-06-05 13:30:24 +02:00
Tristan B. Kildaire
42ef4c4df1 Update install-and-configure-postgres.md 2016-06-05 13:29:43 +02:00
Tristan B. Kildaire
dbb119bd8b Create Configuring Postgres database 2016-06-05 13:29:23 +02:00
Tristan B. Kildaire
9e3e597088 Update building.md 2016-06-05 13:28:44 +02:00
Tristan B. Kildaire
e50099b7c0 Update building.md 2016-06-05 13:28:08 +02:00
Tristan B. Kildaire
55baec7af7 Update building.md 2016-06-05 13:27:16 +02:00
Tristan B. Kildaire
4ab24625fa Update building.md 2016-06-05 13:25:33 +02:00
Tristan B. Kildaire
1eed2cdd1a Update setting-up.md 2016-06-05 13:24:23 +02:00
Tristan B. Kildaire
43a81a6a4d Delete database.md 2016-06-05 13:22:23 +02:00
Tristan B. Kildaire
43dcbad33c Update README.md 2016-06-05 13:21:48 +02:00
Tristan B. Kildaire
89b51773eb Update building.md 2016-06-05 13:20:20 +02:00
Tristan B. Kildaire
47b722a825 Update building.md 2016-06-05 13:19:27 +02:00
Tristan B. Kildaire
76b6bad8a5 Update building.md 2016-06-05 13:18:58 +02:00
Tristan B. Kildaire
648b66cbbe Update building.md 2016-06-05 13:17:28 +02:00
Tristan B. Kildaire
1f2c644bf6 Update building.md 2016-06-05 13:16:22 +02:00
Tristan B. Kildaire
8aed629be6 Update building.md 2016-06-05 13:15:37 +02:00
Tristan B. Kildaire
9042f0f3b0 Update building.md 2016-06-05 13:13:14 +02:00
Tristan B. Kildaire
a425ffea8f Update building.md 2016-06-05 13:11:16 +02:00
Tristan B. Kildaire
a4a4eb7c2a Update srnd.go 2016-06-05 12:59:26 +02:00
Tristan B. Kildaire
a01d5b0cee Update README.md 2016-06-05 12:13:10 +02:00
Tristan B. Kildaire
9f8ce5ab95 Update cli.md 2016-06-05 12:12:05 +02:00
Tristan B. Kildaire
880d1e10e3 Update running.md 2016-06-05 12:11:40 +02:00
Tristan B. Kildaire
ff745ada70 Update running.md 2016-06-05 12:11:04 +02:00
Tristan B. Kildaire
68d7ec783d Update running.md 2016-06-05 12:08:52 +02:00
Tristan B. Kildaire
a17f91fea1 Update README.md 2016-06-05 12:08:36 +02:00
Tristan B. Kildaire
c5cf5ba4f9 Rename doc/configure-newsreader.md to doc/extras/configure-newsreader.md 2016-06-05 12:08:21 +02:00
Tristan B. Kildaire
9f9bebf99c Update setting-up.md 2016-06-05 12:07:22 +02:00
Tristan B. Kildaire
6ea1b2d3b4 Update setting-up.md 2016-06-05 12:06:25 +02:00
Tristan B. Kildaire
acc727b901 Update setting-up.md 2016-06-05 12:05:21 +02:00
Tristan B. Kildaire
594cc4929a Update setting-up.md 2016-06-05 12:04:55 +02:00
Tristan B. Kildaire
e0f15b73fb Rename doc/configuration-files.md to doc/.trash/configuration-files.md 2016-06-05 12:04:22 +02:00
Tristan B. Kildaire
0ac0d7d1ff Update building.md 2016-06-05 12:02:31 +02:00
Tristan B. Kildaire
9a6a4247ce Update README.md 2016-06-05 12:00:46 +02:00
Tristan B. Kildaire
22e384f2d1 Update install-and-configure-redis.md 2016-06-05 11:58:50 +02:00
Tristan B. Kildaire
7c668c5184 Update install-and-configure-postgres.md 2016-06-05 11:58:38 +02:00
Tristan B. Kildaire
91b6dbe9b2 Update setting-up.md 2016-06-05 11:58:12 +02:00
Tristan B. Kildaire
21566eb0d9 Update setting-up.md 2016-06-05 11:57:49 +02:00
Tristan B. Kildaire
cc382572c6 Update setting-up.md 2016-06-05 11:57:37 +02:00
Tristan B. Kildaire
6e029cea0d Update README.md 2016-06-05 11:39:43 +02:00
Tristan B. Kildaire
c92b78c754 Rename configuration.md to configuration-files.md 2016-06-05 11:38:25 +02:00
Tristan B. Kildaire
32eae178fb Update README.md 2016-06-05 11:37:55 +02:00
Tristan B. Kildaire
8a1936fade Update README.md 2016-06-05 11:37:33 +02:00
Tristan B. Kildaire
edd44c73bf Update README.md 2016-06-05 11:36:30 +02:00
Tristan B. Kildaire
b3d346c61f Update README.md 2016-06-05 11:36:12 +02:00
Tristan B. Kildaire
ef124fe7f2 Update README.md 2016-06-05 11:36:04 +02:00
Tristan B. Kildaire
38f9db2f57 Update README.md 2016-06-05 11:35:42 +02:00
Tristan B. Kildaire
e45c172e62 Update README.md 2016-06-05 11:35:34 +02:00
Tristan B. Kildaire
705f3b9df0 Update README.md 2016-06-05 11:35:14 +02:00
Tristan B. Kildaire
1f4e6c8ecb Update README.md 2016-06-05 11:34:54 +02:00
Tristan B. Kildaire
0831c250c4 Rename doc/trash/database.md to doc/.trash/database.md 2016-06-05 11:34:06 +02:00
Tristan B. Kildaire
ecb462c0c3 Update README.md 2016-06-05 11:33:29 +02:00
Tristan B. Kildaire
6092f4e78e Update and rename doc/protocol.md to doc/developer/protocol.md 2016-06-05 11:33:08 +02:00
Tristan B. Kildaire
316729774a Update and rename doc/api.md to doc/developer/api.md 2016-06-05 11:33:06 +02:00
Tristan B. Kildaire
c4f8fd118d Update install-and-configure-redis.md 2016-06-05 11:31:08 +02:00
Tristan B. Kildaire
543108e0d6 Update setting-up.md 2016-06-05 11:30:20 +02:00
Tristan B. Kildaire
6631b881b0 Rename doc/securing-redis.md to doc/database/redis/securing-redis.md 2016-06-05 11:30:00 +02:00
Tristan B. Kildaire
2d39c33f05 Rename doc/install-and-configure-postgres.md to doc/database/postgres/install-and-configure-postgres.md 2016-06-05 11:30:00 +02:00
Tristan B. Kildaire
b32ff7b6ac Rename doc/install-and-configure-redis.md to doc/database/redis/install-and-configure-redis.md 2016-06-05 11:29:59 +02:00
Tristan B. Kildaire
9583b80ac5 Rename postgres.md to install-and-configure-postgres.md 2016-06-05 11:29:14 +02:00
Tristan B. Kildaire
71b46ef1f2 Update setting-up.md 2016-06-05 11:29:01 +02:00
Tristan B. Kildaire
5f0a353482 Rename redis.md to install-and-configure-redis.md 2016-06-05 11:28:37 +02:00
Tristan B. Kildaire
6eb84bf55e Update and rename doc/database.md to doc/trash/database.md 2016-06-05 11:28:08 +02:00
Tristan B. Kildaire
e057ee1812 Update setting-up.md 2016-06-05 11:27:37 +02:00
Tristan B. Kildaire
279e9c18c9 Update setting-up.md 2016-06-05 11:26:57 +02:00
Tristan B. Kildaire
191dbc860c Update setting-up.md 2016-06-05 11:26:03 +02:00
Tristan B. Kildaire
a9403410c8 Update feeds.md 2016-06-05 11:24:13 +02:00
Tristan B. Kildaire
6e2f245f24 Update configuration.md 2016-06-05 11:23:09 +02:00
Tristan B. Kildaire
6d20a991f8 Update redis.md 2016-06-05 11:20:25 +02:00
Tristan B. Kildaire
d20de6b9b5 Update postgres.md 2016-06-05 11:20:06 +02:00
Tristan B. Kildaire
fbb14cc719 Update redis.md 2016-06-05 11:19:53 +02:00
Tristan B. Kildaire
6bb1f4978e Update postgres.md 2016-06-05 11:19:52 +02:00
Tristan B. Kildaire
40d372efe3 Update postgres.md 2016-06-05 11:18:46 +02:00
Tristan B. Kildaire
51672e81c3 Update redis.md 2016-06-05 11:18:34 +02:00
Tristan B. Kildaire
5b06abe63d Update postgres.md 2016-06-05 11:17:58 +02:00
Tristan B. Kildaire
8ebe2d2d26 Update redis.md 2016-06-05 11:15:56 +02:00
Tristan B. Kildaire
b020d13304 Update postgres.md 2016-06-05 11:15:51 +02:00
Tristan B. Kildaire
aa9ae3d32f Update redis.md 2016-06-05 11:15:25 +02:00
Tristan B. Kildaire
53046ad1d2 Update postgres.md 2016-06-05 11:14:19 +02:00
Tristan B. Kildaire
a851eddccf Update redis.md 2016-06-05 10:27:14 +02:00
Tristan B. Kildaire
a2c33bc649 Update README.md 2016-06-05 10:24:31 +02:00
Tristan B. Kildaire
e868b2c73b Update README.md 2016-06-05 10:13:04 +02:00
Tristan B. Kildaire
4de2b15959 Update srnd.md 2016-06-05 10:12:50 +02:00
Tristan B. Kildaire
a57a3b283c Create configure-newsreader.md 2016-06-05 10:12:42 +02:00
Tristan B. Kildaire
b9efd55a57 Update running.md 2016-06-05 10:12:22 +02:00
Tristan B. Kildaire
87097b7a06 Update README.md 2016-06-05 10:12:09 +02:00
Jeff
c50aecc34d Merge pull request #88 from deavmi/patch-1
Update srnd.md
2016-06-04 15:27:06 -04:00
Tristan B. Kildaire
74e0d479a6 Update srnd.md 2016-06-04 21:26:19 +02:00
Tristan B. Kildaire
4420a65dfd Update srnd.md 2016-06-04 21:26:04 +02:00
Jeff
b73ad00865 Merge pull request #87 from deavmi/patch-1
Update README.md
2016-06-04 15:25:41 -04:00
Tristan B. Kildaire
945e609dff Update README.md 2016-06-04 21:25:14 +02:00
Jeff
2c63c3d0ad Merge pull request #82 from deavmi/patch-4
Better name.
2016-06-04 15:12:48 -04:00
Jeff
c86d58a44b Merge pull request #83 from deavmi/patch-5
Rename config.md to setting-up.md
2016-06-04 15:12:37 -04:00
Jeff
12ae47b9b6 Merge pull request #85 from deavmi/master
Some changes
2016-06-04 15:11:24 -04:00
Tristan B. Kildaire
27e19f3591 Update README.md 2016-06-04 21:10:17 +02:00
Tristan B. Kildaire
50a8ddd458 Update README.md 2016-06-04 21:09:13 +02:00
Tristan B. Kildaire
5690e80758 Update running.md 2016-06-04 21:08:58 +02:00
Tristan B. Kildaire
489b21fd04 Update README.md 2016-06-04 21:04:48 +02:00
Tristan B. Kildaire
f9b08aa467 Rename build.md to building.md 2016-06-04 21:04:46 +02:00
Tristan B. Kildaire
85938d1f6b Merge pull request #1 from majestrate/master
f
2016-06-04 21:02:54 +02:00
Jeff
a1d02708fa Merge pull request #80 from deavmi/patch-2
My eyes are bleeding from using GitHub's white-white editor
2016-06-04 15:01:59 -04:00
Tristan B. Kildaire
f3f051fbf1 Rename config.md to setting-up.md 2016-06-04 21:00:59 +02:00
Jeff
d078e58774 Merge pull request #81 from deavmi/patch-3
Looks better
2016-06-04 15:00:42 -04:00
Tristan B. Kildaire
d8ecf670d5 Rename build.md to building.md 2016-06-04 20:59:39 +02:00
Tristan B. Kildaire
1bd84c839e Update srnd.md 2016-06-04 20:59:04 +02:00
Tristan B. Kildaire
5bfa14ba1a Update protocol.md 2016-06-04 20:57:52 +02:00
Jeff
7d258d9f3b Merge pull request #78 from deavmi/patch-2
Create README.md
2016-06-04 14:37:38 -04:00
Jeff
57d8fd4841 Merge pull request #77 from deavmi/patch-1
Update config.md
2016-06-04 14:37:33 -04:00
Tristan B. Kildaire
a8653a472e Create README.md 2016-06-04 20:34:07 +02:00
Tristan B. Kildaire
45c0cf142d Update config.md 2016-06-04 20:32:26 +02:00
Jeff
f53d9b8a5b Merge pull request #74 from deavmi/patch-2
Update README.md
2016-06-04 14:28:42 -04:00
Tristan B. Kildaire
42ea131dff Update README.md 2016-06-04 20:27:32 +02:00
Jeff
57ca993189 Merge pull request #71 from deavmi/patch-1
Work in progress afrikaans translations
2016-06-04 14:25:32 -04:00
Jeff
9d4b43c7e9 Merge pull request #73 from deavmi/patch-2
Create fr-FR.ini
2016-06-04 14:24:35 -04:00
Jeff
8802d5feef Merge pull request #70 from deavmi/master
add more documentation
2016-06-04 14:23:13 -04:00
Tristan B. Kildaire
b8d58ab3e3 Update fr-FR.ini 2016-06-04 19:59:32 +02:00
Tristan B. Kildaire
00e2e4d03d Create fr-FR.ini 2016-06-04 19:57:13 +02:00
Tristan B. Kildaire
9ed02e4df0 Work in progress afrikaans translations 2016-06-04 19:54:03 +02:00
d
59a8e244a0 Nicer ending message. 2016-06-04 19:41:26 +02:00
d
3bd9e85682 : 2016-06-04 19:37:04 +02:00
Tristan B. Kildaire
3749445531 Update cli.md 2016-06-04 19:25:22 +02:00
Tristan B. Kildaire
5337fea89f Update cli.md 2016-06-04 19:25:06 +02:00
Tristan B. Kildaire
77e1f16624 Update cli.md 2016-06-04 19:24:12 +02:00
Tristan B. Kildaire
28b8c5059c Update securing-redis.md 2016-06-04 18:57:21 +02:00
Tristan B. Kildaire
285f5c271a Update config.md 2016-06-04 18:07:40 +02:00
Tristan B. Kildaire
e143a78e20 Update config.md 2016-06-04 18:04:17 +02:00
Tristan B. Kildaire
b9905ebae4 Update config.md 2016-06-04 18:01:40 +02:00
Tristan B. Kildaire
89dee3b72d Update config.md 2016-06-04 18:00:27 +02:00
Tristan B. Kildaire
18ea50ab18 Update config.md 2016-06-04 17:59:54 +02:00
Tristan B. Kildaire
1fb23dd34a Update config.md 2016-06-04 17:56:17 +02:00
Tristan B. Kildaire
6ce938b86a Update config.md 2016-06-04 17:55:50 +02:00
Tristan B. Kildaire
a853409230 Update config.md 2016-06-04 17:55:01 +02:00
Tristan B. Kildaire
cfeb11b545 Update config.md 2016-06-04 17:51:21 +02:00
Tristan B. Kildaire
963b893e39 Update config.md 2016-06-04 17:51:07 +02:00
Tristan B. Kildaire
a75c22aecb Update config.md 2016-06-04 17:50:46 +02:00
Tristan B. Kildaire
ca2d87e303 Update config.md 2016-06-04 17:50:02 +02:00
Tristan B. Kildaire
bf143f07f7 Update config.md 2016-06-04 17:45:22 +02:00
Tristan B. Kildaire
850e61d923 Update config.md 2016-06-04 17:44:32 +02:00
Tristan B. Kildaire
c5937bc3f7 Update config.md 2016-06-04 17:44:10 +02:00
Tristan B. Kildaire
4436c62fe2 Update config.md 2016-06-04 17:43:05 +02:00
Tristan B. Kildaire
71bb46cb5b Update README.md 2016-06-04 17:40:16 +02:00
Tristan B. Kildaire
f06daf111a Update README.md 2016-06-04 17:40:09 +02:00
Tristan B. Kildaire
93434f3bf6 Update README.md 2016-06-04 17:39:34 +02:00
Tristan B. Kildaire
90aaad39bf Create config.md 2016-06-04 17:36:26 +02:00
Tristan B. Kildaire
8492cc35fa Update build.md 2016-06-04 17:35:00 +02:00
Tristan B. Kildaire
5087a0de7a Update build.md 2016-06-04 17:34:43 +02:00
Tristan B. Kildaire
dfe6eae59f Update build.md 2016-06-04 17:32:57 +02:00
Tristan B. Kildaire
030a9e58e8 Update build.md 2016-06-04 17:31:24 +02:00
Tristan B. Kildaire
7a73cf3d55 Update build.md 2016-06-04 17:28:24 +02:00
Tristan B. Kildaire
8e1eb8620c Update build.md 2016-06-04 17:27:39 +02:00
Tristan B. Kildaire
546f4d413f Create securing-redis.md 2016-06-04 17:26:36 +02:00
Tristan B. Kildaire
aa04d1d3ba Update build.md 2016-06-04 17:18:14 +02:00
Tristan B. Kildaire
27eae6750c Update build.md 2016-06-04 17:18:03 +02:00
Tristan B. Kildaire
3174aaad22 Update build.md 2016-06-04 17:17:54 +02:00
Tristan B. Kildaire
89c4fe4a96 Update build.md 2016-06-04 17:16:55 +02:00
Tristan B. Kildaire
4f204fd873 Update build.md 2016-06-04 17:16:08 +02:00
Tristan B. Kildaire
7612b629ad Update README.md 2016-06-04 17:11:06 +02:00
Tristan B. Kildaire
0d5b0ddb0b Update README.md 2016-06-04 17:09:35 +02:00
Tristan B. Kildaire
b41d2fa532 Update README.md 2016-06-04 17:08:46 +02:00
Tristan B. Kildaire
52239bebc3 Update README.md 2016-06-04 17:08:25 +02:00
Jeff
a7a97709fe Merge pull request #68 from ZiRo-/master
add filenames to images
2016-05-22 17:54:26 -04:00
ZiRo
e0789c8f90 add filenames to images 2016-05-22 22:51:26 +02:00
Jeff
c5e90ec550 Merge pull request #67 from ZiRo-/master
add download link for files with original filename
2016-05-22 15:17:19 -04:00
ZiRo
6840c28cb8 Merge remote-tracking branch 'upstream/master' 2016-05-22 20:22:31 +02:00
ZiRo
41caf046a0 add download link for files 2016-05-22 20:22:12 +02:00
Jeff
deb5a36c0d Merge pull request #66 from ZiRo-/master
add captcha reload script
2016-05-22 06:03:09 -04:00
ZiRo
920ddb64b3 add captcha reload script 2016-05-22 07:51:12 +02:00
Jeff Becker
af59a38a40 Revert "fix prefixing for overview template"
This reverts commit 8401c5a25d.
2016-05-20 06:25:30 -04:00
Jeff
8bca301e55 Merge pull request #63 from ZiRo-/master
fix prefixing for overview template
2016-05-20 06:12:59 -04:00
ZiRo
8401c5a25d fix prefixing for overview template 2016-05-20 07:03:54 +02:00
Jeff
ab44cb2457 * add generated javascript files to .gitignore
* untrack generated javascript files

* regen generated javascript via build.sh by default
2016-05-18 13:22:56 -04:00
Jeff
e831a56809 move cuckoo-miner building to build-js.sh 2016-05-18 13:16:06 -04:00
Jeff
84cac4ceec Merge pull request #62 from ZiRo-/master
make miner multi threaded
2016-05-18 12:59:07 -04:00
ZiRo
e372893373 make miner multi threaded 2016-05-18 18:54:05 +02:00
Jeff
4f0ae8fec3 Merge pull request #61 from ZiRo-/master
make final adjustments to the siphash function
2016-05-18 10:22:24 -04:00
ZiRo
7f445f81fc make final adjustments to the siphash function 2016-05-18 16:17:41 +02:00
Jeff
28c18afaf9 Merge pull request #60 from ZiRo-/master
use native js function for siphash
2016-05-18 07:59:46 -04:00
ZiRo
6008c94949 use native js function for siphash 2016-05-18 13:41:20 +02:00
Jeff
8dc1218934 Merge pull request #59 from ZiRo-/master
make postform more compact
2016-05-17 17:57:19 -04:00
ZiRo
11204cba16 make postform more compact 2016-05-17 16:33:14 +02:00
Jeff
e3928bc6c2 Merge pull request #58 from ZiRo-/master
add cuckoo miner to postform
2016-05-17 07:52:44 -04:00
ZiRo
c2bd325be6 add miner.js to build.sh 2016-05-17 13:27:29 +02:00
ZiRo
941c4a3a9f indicate mining process 2016-05-17 08:55:21 +02:00
ZiRo
261493af0b add cuckoo miner to postform 2016-05-17 08:24:46 +02:00
Jeff Becker
1791fc475b bump ipfs version 2016-05-15 08:19:03 -04:00
Jeff Becker
de7cec2c43 try another way using build.sh 2016-05-13 10:50:18 -04:00
Jeff Becker
e7c90c647d ammend build.sh to use mv not cp with finished binary 2016-05-13 10:47:56 -04:00
Jeff Becker
9596c1e27e try simpler build.sh 2016-05-13 10:41:51 -04:00
Jeff Becker
c86732ba5c try fixing build.sh 2016-05-13 10:36:56 -04:00
Jeff Becker
2a7c15241f add meaningful message before long pause of gx 2016-05-13 10:29:46 -04:00
Jeff Becker
d2d81ccbd0 try to make build.sh work 2016-05-13 10:16:09 -04:00
Jeff Becker
78a5138409 try using -d flag 2016-05-13 10:14:27 -04:00
Jeff Becker
bdd9ae9ae4 try again 2016-05-13 10:12:58 -04:00
Jeff Becker
a8a98b03fb ugh 2016-05-13 10:12:11 -04:00
Jeff Becker
4a5fd4aba0 try fixing borked build.sh 2016-05-13 10:11:28 -04:00
Jeff Becker
2de7c633d4 tweak build.sh 2016-05-13 10:10:12 -04:00
Jeff Becker
56c72d1d74 use go get instead of go build 2016-05-13 10:06:39 -04:00
Jeff Becker
f3793852a2 try fixing build.sh again 2016-05-13 10:05:49 -04:00
Jeff Becker
382875509b try correcting location of vendor packages 2016-05-13 10:04:04 -04:00
Jeff Becker
5da696d1c8 fix checks for gx and gx-go 2016-05-13 09:56:51 -04:00
Jeff Becker
7f1800a0c6 only obtain gx if we do not have it 2016-05-13 09:52:35 -04:00
Jeff Becker
504c9ae84e fix missing command 2016-05-13 09:51:35 -04:00
Jeff Becker
63a3511c84 remove redundant command 2016-05-13 09:49:48 -04:00
Jeff Becker
309d8e6c45 tweak build.sh 2016-05-13 09:47:01 -04:00
Jeff Becker
403c404ced tweak build.sh 2016-05-13 09:44:14 -04:00
Jeff Becker
133b032f1d tweak build.sh again 2016-05-13 09:38:57 -04:00
Jeff Becker
ac0b171f19 tweak build.sh 2016-05-13 09:37:32 -04:00
Jeff Becker
0e57fe057f update build.sh to use vendor 2016-05-13 09:33:59 -04:00
Jeff Becker
6e4398f0c2 update gx stuffs 2016-05-13 09:30:24 -04:00
Jeff Becker
136a0878af remove mp3 from repo so gx publish doesn't take forever 2016-05-13 09:01:08 -04:00
Jeff Becker
813c00e3ea bump package version 2016-05-13 08:57:29 -04:00
Jeff Becker
d8625a1cb5 update ipfs hashes 2016-05-13 08:49:43 -04:00
Jeff
c7d322c09d fix :^) 2016-05-08 08:36:42 -04:00
Jeff
f7e8359f7b fix typo 2016-05-04 14:03:48 -04:00
Jeff
3283e53c5c show reply box on ukko page 2016-05-04 14:02:04 -04:00
Jeff
fb2b80335e don't show reply box if not created 2016-05-04 13:14:57 -04:00
Jeff
96f6044489 try to make sure e is not null 2016-05-04 13:12:46 -04:00
Jeff
8f1a497f13 update minified 2016-05-04 13:10:55 -04:00
Jeff
272fe26b26 style changes 2016-05-04 13:10:46 -04:00
Jeff
dec1a3e78d add debugging 2016-05-04 13:06:15 -04:00
Jeff
85ce14091a disable replybox on thread and board pages, default to overchan.random for livechand ukko pages 2016-05-04 13:03:32 -04:00
Jeff
faf5071740 add comment 2016-05-03 15:20:08 -04:00
Jeff
aadf8a9bfa remove conflicting css 2016-05-03 15:14:00 -04:00
Jeff
6ccb829fb9 remove unneeded functions 2016-05-03 15:12:11 -04:00
Jeff
3be1c3e081 try fixing style 2016-05-03 15:10:26 -04:00
Jeff
3e20e100f5 fug 2016-05-03 15:08:16 -04:00
Jeff
f227786e33 try fixing drag to move behavior 2016-05-03 15:07:20 -04:00
Jeff
82d71588e9 try fixing undefined behavior 2016-05-03 15:06:00 -04:00
Jeff
521c135498 use stack overflow example 2016-05-03 15:04:38 -04:00
Jeff
ae45d3e516 try fixing drag and drop 2016-05-03 15:02:01 -04:00
Jeff
363bf49799 try fixing undefined behavior on drag 2016-05-03 15:00:58 -04:00
Jeff
8782dffeae fix typo 2016-05-03 15:00:11 -04:00
Jeff
da4e56fe25 add jquery :< 2016-05-03 14:58:57 -04:00
Jeff
eb9a8e5174 try fix 2016-05-03 14:43:42 -04:00
Jeff
bd45322509 try fix 2016-05-03 14:43:23 -04:00
Jeff
2705a111c6 try fix 2016-05-03 14:42:53 -04:00
Jeff
bb748f9a74 try fix 2016-05-03 14:41:51 -04:00
Jeff
1ef0430392 try fix 2016-05-03 14:39:17 -04:00
Jeff
2415c10029 try fix 2016-05-03 14:37:23 -04:00
Jeff
f6f84f25c8 try fix 2016-05-03 14:36:18 -04:00
Jeff
23c4f455d5 try fix 2016-05-03 14:34:40 -04:00
Jeff
b1ebd3826a try fix 2016-05-03 14:33:41 -04:00
Jeff
914c69215e try fix 2016-05-03 14:30:21 -04:00
Jeff
fdb34a7816 try fix 2016-05-03 14:30:06 -04:00
Jeff
21b80ecc8d try fix 2016-05-03 14:29:23 -04:00
Jeff
d0d1bed10a try fix 2016-05-03 14:27:07 -04:00
Jeff
2613c57bf8 try fix 2016-05-03 14:25:32 -04:00
Jeff
43bb6e4c5c try fix 2016-05-03 14:23:45 -04:00
Jeff
7136b176ee try fix 2016-05-03 14:22:10 -04:00
Jeff
7767b6d436 try fix 2016-05-03 14:20:35 -04:00
Jeff
98b2834bd1 try fix 2016-05-03 14:19:16 -04:00
Jeff
d1f540f99a try fix 2016-05-03 14:17:41 -04:00
Jeff
7bdb104fcf try fix 2016-05-03 14:16:15 -04:00
Jeff
9e68e626c9 try fix 2016-05-03 14:13:48 -04:00
Jeff
7df2e6c83b try fix 2016-05-03 14:09:47 -04:00
Jeff
9aca55ec71 try fix 2016-05-03 14:08:58 -04:00
Jeff
9f55486107 try fix 2016-05-03 14:07:48 -04:00
Jeff
4e161a5d70 try fix 2016-05-03 14:06:22 -04:00
Jeff
ee3b067555 try fix 2016-05-03 14:05:27 -04:00
Jeff
64c5b1589b try fix 2016-05-03 14:03:19 -04:00
Jeff
7b3a6329a6 try fix 2016-05-03 14:02:13 -04:00
Jeff
fab83592b7 try fix 2016-05-03 13:59:10 -04:00
Jeff
7b8d229b64 try fix 2016-05-03 13:57:48 -04:00
Jeff
b2d0bfea8c try fix 2016-05-03 13:57:01 -04:00
Jeff
9ce09c34c3 try fix 2016-05-03 13:55:22 -04:00
Jeff
fdd9bab210 try fix 2016-05-03 13:47:28 -04:00
Jeff
ee73b907de try fix 2016-05-03 13:46:32 -04:00
Jeff
27192b0248 try fix 2016-05-03 13:24:49 -04:00
Jeff
45267caa0a try fix 2016-05-03 13:16:36 -04:00
Jeff
f6576aa899 try fix 2016-05-03 13:16:18 -04:00
Jeff
ce8180c804 try fix 2016-05-03 13:15:20 -04:00
Jeff
5375252783 try fix 2016-05-03 13:14:39 -04:00
Jeff
cc5806a035 try fix 2016-05-03 13:13:54 -04:00
Jeff
1fa694282b try fix 2016-05-03 13:09:05 -04:00
Jeff
f94491e38d try fix 2016-05-03 13:08:07 -04:00
Jeff
df4b263f39 try fix 2016-05-03 13:05:45 -04:00
Jeff
3fb94baaca revert to clientX/Y 2016-05-03 13:01:55 -04:00
Jeff
be7831cd10 use shift key for drag 2016-05-03 13:00:41 -04:00
Jeff
7daa0f8520 use screenX/y instead of clientX/y 2016-05-03 12:38:46 -04:00
Jeff
7afd47805a remove stray assignment 2016-05-03 12:35:46 -04:00
Jeff
def0a4a5c5 adgo back to drag events 2016-05-03 12:33:24 -04:00
Jeff
3fdda45425 add debugging and try new method for drag 2016-05-03 12:30:59 -04:00
Jeff
56a345949d try using different drag method for reply box 2016-05-03 12:28:19 -04:00
Jeff
2a08f73db4 use alternative layout in postform for postform_msg 2016-05-03 12:17:08 -04:00
Jeff
52bafb364d update build scripts to work with non-gnu readlink 2016-05-03 12:16:36 -04:00
Jeff
a4c70fe77b rename backlink.js to reply.js 2016-05-03 11:44:08 -04:00
Jeff Becker
58d32b5d1d don't double post 2016-05-01 18:04:43 -04:00
Jeff Becker
a389c8b82d make image expansion case insensitive 2016-05-01 17:56:47 -04:00
Jeff Becker
c8e8ab95cd "" -> null aka, js is shit 2016-05-01 17:48:17 -04:00
Jeff Becker
331fed1731 try blanking out attachments after posting 2016-05-01 17:38:37 -04:00
Jeff Becker
5bcbe255b1 change post success message 2016-05-01 17:27:08 -04:00
Jeff Becker
ba045b6903 show "posting..." message right before posting 2016-05-01 17:25:08 -04:00
Jeff Becker
187eef590d try clearing reply box on success 2016-05-01 10:42:06 -04:00
Jeff Becker
06ff6554d4 return false for onsubmit 2016-05-01 10:34:05 -04:00
Jeff Becker
d217776201 try using onsubmit for reply box form 2016-05-01 10:31:14 -04:00
Jeff Becker
76949151de fix typo 2016-04-30 16:36:21 -04:00
Jeff Becker
a6f418d3a9 try using ctl drag 2016-04-30 16:32:10 -04:00
Jeff Becker
fa27cc64ef fug 2016-04-30 16:29:41 -04:00
Jeff Becker
e042d0fef7 use shift+drag for moving reply box 2016-04-30 16:28:26 -04:00
Jeff Becker
2eefe2e301 use alt+click drag for moving reply box 2016-04-30 16:25:27 -04:00
Jeff Becker
b1c1e4fab3 use prevent default in drag 2016-04-30 16:23:13 -04:00
Jeff Becker
68a83205ab add captcha updating 2016-04-30 16:20:27 -04:00
Jeff Becker
950441ef45 fix variable name 2016-04-30 16:19:08 -04:00
Jeff Becker
e01002ed25 fix posting style 2016-04-30 16:18:08 -04:00
Jeff Becker
9d7eceb927 use appendChild 2016-04-30 16:14:47 -04:00
Jeff Becker
2b28431568 add posting message 2016-04-30 16:12:01 -04:00
Jeff Becker
0df3fe43e0 fix undefined error 2016-04-30 16:11:20 -04:00
Jeff Becker
1a3fe3af66 try fixing bug where reply box exists but doesn't submit 2016-04-30 16:09:59 -04:00
Jeff Becker
6d6ba47b2c try fixing async posting 2016-04-30 16:08:11 -04:00
Jeff Becker
d47d390536 try implementing async post via reply box 2016-04-30 16:03:39 -04:00
Jeff Becker
157d1f8cb9 be aware of screen size 2016-04-30 15:13:52 -04:00
Jeff Becker
5df2ecac0c debug fixes 2016-04-30 15:11:32 -04:00
Jeff Becker
1452be84bf fug 2016-04-30 15:10:15 -04:00
Jeff Becker
d5d005e74b try fix again 2016-04-30 15:09:01 -04:00
Jeff Becker
846fe26ec5 try aligning right 2016-04-30 15:07:56 -04:00
Jeff Becker
940ac4dec0 fuggg 2016-04-30 15:07:07 -04:00
Jeff Becker
3a26c3e38e try to fix movement of reply box 2016-04-30 15:06:12 -04:00
Jeff Becker
0a4a3b4f8a screenX -> screenLeft 2016-04-30 15:05:31 -04:00
Jeff Becker
11f096e195 try fixing movement of reply box 2016-04-30 15:04:53 -04:00
Jeff Becker
02330805e9 try fixing movement of reply window 2016-04-30 15:03:54 -04:00
Jeff Becker
ed5be31c22 try fixing movement 2016-04-30 15:02:09 -04:00
Jeff Becker
d99a222434 add semicolon 2016-04-30 15:01:11 -04:00
Jeff Becker
01bd911084 try fixing oob 2016-04-30 15:00:34 -04:00
Jeff Becker
79ae266424 different initial position 2016-04-30 14:57:57 -04:00
Jeff Becker
e9db85c5b6 add semi-colins, this aint go 2016-04-30 14:57:07 -04:00
Jeff Becker
d82f2e3732 use different method for moveto 2016-04-30 14:56:22 -04:00
Jeff Becker
2d9aac039c enable dragable 2016-04-30 14:54:24 -04:00
Jeff Becker
917b15156c ugh 2016-04-30 14:53:32 -04:00
Jeff Becker
b03b18b05f fix? 2016-04-30 14:52:56 -04:00
Jeff Becker
7527e4c978 try fixing drag to move again 2016-04-30 14:52:19 -04:00
Jeff Becker
702dcf7997 try making not dragable 2016-04-30 14:49:09 -04:00
Jeff Becker
5cd2c3d43a more fixes in drag to move 2016-04-30 14:48:30 -04:00
Jeff Becker
3e4d128b9c fix 2016-04-30 14:46:05 -04:00
Jeff Becker
ecb223ebc4 try fixing drag to move for reply box 2016-04-30 14:44:06 -04:00
Jeff Becker
61e390daf0 add logging 2016-04-30 13:32:38 -04:00
Jeff Becker
4264004eaf fix x,y 2016-04-30 13:31:57 -04:00
Jeff Becker
ac4eb96a69 add px to style 2016-04-30 13:31:03 -04:00
Jeff Becker
d59cb4f9a8 again 2016-04-30 13:28:59 -04:00
Jeff Becker
ad1ff687f6 try fixing drag to move 2016-04-30 13:27:54 -04:00
Jeff Becker
480c40ce4f try fixing drag to move 2016-04-30 13:26:42 -04:00
Jeff Becker
a1142aa670 again 2016-04-30 13:25:29 -04:00
Jeff Becker
6fddac0245 try fixing drag to move 2016-04-30 13:24:13 -04:00
Jeff Becker
531da63e7b try fixing drag to move 2016-04-30 13:22:17 -04:00
Jeff Becker
d52a63586f update drag to move for post form 2016-04-30 13:19:34 -04:00
Jeff Becker
3710ed884e start adding move by drag to reply box 2016-04-30 13:18:17 -04:00
Jeff Becker
9019bf2e9a update reply box css 2016-04-30 13:10:04 -04:00
Jeff Becker
de6d2964f9 update reply box 2016-04-30 13:09:40 -04:00
Jeff Becker
12f5e67bb4 css update 2016-04-30 13:08:38 -04:00
Jeff Becker
b71d62ca35 fix quickreply 2016-04-30 13:06:29 -04:00
Jeff Becker
fffe030fa2 update dynamic reply 2016-04-30 13:03:18 -04:00
Jeff Becker
74099cb5f2 css fix 2016-04-30 13:01:36 -04:00
Jeff Becker
d55716dc9b update css and position for reply box 2016-04-30 13:00:27 -04:00
Jeff Becker
dabbf4d143 update position of post reply box 2016-04-30 12:58:24 -04:00
Jeff Becker
048300d6e4 fix js id for postform_container 2016-04-30 12:56:24 -04:00
Jeff Becker
3a1a24f6da fix css 2016-04-30 12:55:43 -04:00
Jeff Becker
5fccdeba45 fix css typo 2016-04-30 12:53:01 -04:00
Jeff Becker
72e10a8734 update css 2016-04-30 12:52:16 -04:00
Jeff Becker
b78054a751 update css 2016-04-30 12:51:20 -04:00
Jeff Becker
c394114c4e update class for dynamic postform 2016-04-30 12:42:30 -04:00
Jeff Becker
7aa6eb28b2 append table row 2016-04-30 12:41:23 -04:00
Jeff Becker
a96b4d0585 document.appendChild -> document.body.appendChild 2016-04-30 12:39:46 -04:00
Jeff Becker
c8217dad84 try fixing dynamic reply 2016-04-30 12:37:36 -04:00
Jeff Becker
926aa0b69f try fixing dynamic reply 2016-04-30 12:35:21 -04:00
Jeff Becker
a51f9a77e6 more debugging 2016-04-30 12:34:29 -04:00
Jeff Becker
f0fd23e6a9 more logging 2016-04-30 12:33:29 -04:00
Jeff Becker
85dc5da83a add logging 2016-04-30 12:29:51 -04:00
Jeff Becker
1b7526ff2f initial dynamic reply code 2016-04-30 12:25:15 -04:00
Jeff Becker
982cbf2eb1 update minified 2016-04-30 10:08:44 -04:00
Jeff Becker
c455edcd59 don't include mathjax in minified js 2016-04-30 10:05:06 -04:00
Jeff Becker
ed489f9d89 use correct git command 2016-04-30 09:59:59 -04:00
Jeff Becker
07d6bc2cd7 update build-js.sh to check for submodule correctly 2016-04-30 09:59:17 -04:00
Jeff Becker
cdcd0ce68d add mathjax submodule 2016-04-30 09:58:21 -04:00
Jeff Becker
861acbbe0a revert css to not use flex 2016-04-30 09:11:33 -04:00
Jeff Becker
7e47470cea fix bug with inline image expand where br element leaves spaces after expand 2016-04-30 09:06:08 -04:00
Jeff Becker
d1bf4cc7f3 update css 2016-04-30 09:02:50 -04:00
Jeff Becker
e2968dbd97 fix js 2016-04-30 08:51:49 -04:00
Jeff Becker
ed62c4e879 update image-inline 2016-04-30 08:51:01 -04:00
Jeff Becker
a02c6f040e update css 2016-04-30 08:48:28 -04:00
Jeff Becker
7022dbf8c1 try fixing inline expand again 2016-04-30 08:42:54 -04:00
Jeff Becker
14cf2cbe5b again 2016-04-30 08:40:21 -04:00
Jeff Becker
6a73f5d727 try again 2016-04-30 08:38:50 -04:00
Jeff Becker
5a069dbb9a try fixing inline image more 2016-04-30 08:38:11 -04:00
Jeff Becker
77be791ce7 try fixing inline image expand again 2016-04-30 08:36:46 -04:00
Jeff Becker
d69ee3a8d0 try fixing image-inline 2016-04-30 08:34:33 -04:00
Jeff Becker
115e2884c1 fix url for image inline 2016-04-30 08:32:28 -04:00
Jeff Becker
f9ab15e271 add debugging 2016-04-30 08:31:37 -04:00
Jeff Becker
6c5aed6a3c bugfix 2016-04-30 08:30:14 -04:00
Jeff Becker
cc0a0bc269 add initial expand images js 2016-04-30 08:26:14 -04:00
Jeff Becker
fe2fb50775 add doctype 2016-04-29 14:08:02 -04:00
Jeff
a423b6bfe6 Merge pull request #56 from ZiRo-/master
Add inline webm playback & make js files modular
2016-04-27 13:47:36 +00:00
ZiRo
7441463de3 copy&past is bad 2016-04-27 15:40:41 +02:00
ZiRo
2dea0917d1 Add inline webm playback 2016-04-27 15:36:57 +02:00
ZiRo
d059971dcc make js more modular 2016-04-27 14:21:12 +02:00
Jeff Becker
fd60d92728 css tweak, use :target 2016-04-26 09:43:11 -04:00
Jeff Becker
4737932a3e css tweak 2016-04-26 09:40:06 -04:00
Jeff Becker
32c5df4ffd css fix for hover 2016-04-26 09:36:02 -04:00
Jeff Becker
dede4299dc fix hover a bit 2016-04-26 09:23:38 -04:00
Jeff Becker
57afa2ce4b backlinks sorta work 2016-04-26 09:13:04 -04:00
Jeff Becker
4a79b1c998 tweak scrollback limit and add "readonly" note 2016-04-25 17:17:59 -04:00
Jeff Becker
5443e06b38 reconnect liveui on close 2016-04-25 17:08:31 -04:00
Jeff Becker
69f08dbb58 fixups 2016-04-25 16:47:14 -04:00
Jeff Becker
9f5409a66a fix live.mustache 2016-04-25 16:33:51 -04:00
Jeff Becker
6ff21ebaeb insert placeholder so livechan widget calls onload 2016-04-25 16:32:10 -04:00
Jeff Becker
14fe9fe916 add liveui page 2016-04-25 16:29:11 -04:00
Jeff Becker
5c66f4684a liveui 2016-04-25 15:57:49 -04:00
Jeff Becker
6797e68ddd up error screen waiting time 2016-04-22 17:59:44 -04:00
Jeff Becker
86088b52e8 up wait time on post success page 2016-04-21 21:27:00 -04:00
Jeff Becker
b44c711483 try fixing catalog theme changer 2016-04-21 15:44:34 -04:00
Jeff Becker
d38ff65c22 use old style build D: 2016-04-18 19:42:24 -04:00
Jeff Becker
02cafc2cc5 update to next hash 2016-04-18 17:11:40 -04:00
Jeff Becker
d956f5334c ignore nntpchan bin in gitignore 2016-04-18 09:58:28 -04:00
Jeff Becker
3799c8caa1 try fixing build.sh more again again 2016-04-18 09:33:40 -04:00
Jeff Becker
bcb12ecb0f try fixing build.sh AGAIN 2016-04-18 09:27:53 -04:00
Jeff Becker
b89ca0dc72 try fixing build.sh again 2016-04-18 09:26:09 -04:00
Jeff Becker
893491ce25 try fixing build.sh 2016-04-18 09:22:33 -04:00
Jeff Becker
51d031566a fix build.sh more 2016-04-18 08:47:48 -04:00
Jeff Becker
a54b928a67 fix build.sh 2016-04-18 08:46:46 -04:00
Jeff Becker
8ac1c210f2 use gx for package management 2016-04-18 08:40:01 -04:00
Jeff Becker
8d83e4dbaf update readme 2016-04-18 08:09:42 -04:00
Jeff Becker
d4a200e921 update readme to include both githug and gitgud links for bugs 2016-04-18 08:08:06 -04:00
Jeff Becker
e1f9efffbc update readme to include frontend list 2016-04-17 17:52:12 -04:00
Jeff Becker
61de708062 add tomorrow css theme from TJBK 2016-04-15 20:17:32 -04:00
Jeff Becker
411230f48a fix 2016-04-12 19:41:38 -04:00
Jeff Becker
5530ae113e fix 2016-04-12 19:40:55 -04:00
Jeff Becker
29b2db8198 update csrf 2016-04-12 19:39:56 -04:00
Jeff Becker
bc239360ea update docs to include info about web ui installer 2016-04-03 08:57:02 -04:00
Jeff Becker
558553a587 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-04-03 08:17:55 -04:00
Jeff Becker
23752f0996 update docs 2016-04-03 08:17:36 -04:00
Jeff
317bbbf457 Merge pull request #54 from ZiRo-/master
Add installer
2016-03-29 17:47:10 +00:00
ZiRo
177082fded Even more installer dialogs 2016-03-29 18:48:37 +02:00
ZiRo
323f2f150c Some more installer dialogs 2016-03-29 15:58:28 +02:00
ZiRo
44ff1d2fb6 Add database installer 2016-03-29 13:38:38 +02:00
ZiRo
390574ed45 initial installer 2016-03-28 15:34:38 +02:00
Jeff Becker
60dec3db4a fix typo 2016-03-25 10:06:56 -04:00
Jeff Becker
00a69ad685 add sync all feeds part to feeds page 2016-03-25 10:03:31 -04:00
Jeff Becker
2959be4564 another check for no element 2016-03-25 10:01:33 -04:00
Jeff Becker
5d14475373 add link to nntp feed page on mod panel 2016-03-25 10:00:21 -04:00
Jeff Becker
62e59d4201 add check for mod feed page, feeds page does not have nntpchan_mod_target element 2016-03-25 09:57:38 -04:00
Jeff Becker
af02424d20 move call of initial update function to script block 2016-03-25 09:53:47 -04:00
Jeff Becker
33c6c33af2 update mod panel, begin migration to gx 2016-03-25 09:48:19 -04:00
Jeff Becker
7a67e38bf1 add .gxignore 2016-03-23 09:45:06 -04:00
Jeff Becker
9a75911ab7 update mod ui 2016-03-12 11:24:04 -05:00
Jeff Becker
8181d174a5 add hr in connection state 2016-03-12 10:18:43 -05:00
Jeff Becker
c618440878 span -> div 2016-03-12 10:16:45 -05:00
Jeff Becker
0bc6298cc0 update mod ui to have more details 2016-03-12 10:15:56 -05:00
Jeff Becker
93b452c497 update mod ui feed connection elements 2016-03-12 10:13:17 -05:00
Jeff Becker
b2d46c9021 fix typo 2016-03-12 09:45:31 -05:00
Jeff Becker
f972d91137 update mod panel connections view 2016-03-12 09:44:51 -05:00
Jeff Becker
f8a6b32b5f add expiration of orphaned articles command to mod page 2016-03-12 08:29:57 -05:00
Jeff Becker
439ab7583a add synchronize feeds command in mod panel 2016-03-12 07:56:29 -05:00
Jeff Becker
5800b1bf1d add note about redis version 2016-03-11 20:16:10 -05:00
Jeff Becker
1ba53b7688 update archiver to support multiple attachments 2016-03-10 10:07:19 -05:00
Jeff Becker
dd2eb90230 update post fail page 2016-03-09 13:27:34 -05:00
Jeff Becker
2319327917 update older templates to be aware of themes 2016-03-09 13:23:58 -05:00
Jeff Becker
89dfe68b32 update bloodgod theme for 404 page 2016-03-09 13:21:19 -05:00
Jeff Becker
c4dadd21fc update 404 page 2016-03-09 13:16:46 -05:00
Jeff Becker
812d7cfd9d 404 page 2016-03-09 12:54:21 -05:00
Jeff Becker
415f0d6e39 update install.sh to have build options passed into build.sh 2016-03-09 10:59:22 -05:00
Jeff Becker
08d97147b8 add simple install script 2016-03-09 10:41:24 -05:00
Jeff Becker
23614275eb spacing 2016-03-09 10:05:52 -05:00
Jeff Becker
1eca5c59e3 update readme irc links 2016-03-09 10:05:23 -05:00
Jeff Becker
91953148e8 update readme to point to build instructions 2016-03-09 08:41:37 -05:00
Jeff Becker
c5a5fb57d9 update build documentation 2016-03-09 08:40:18 -05:00
Jeff Becker
5b8d338840 add --disable-redis option to build.sh 2016-03-09 08:36:44 -05:00
Jeff Becker
5bc7c92e71 only apply theme if parameters are correct 2016-03-08 20:35:03 -05:00
Jeff Becker
f32bd8c946 update dayman theme 2016-03-08 18:18:28 -05:00
Jeff Becker
ca333e06ac update dayman theme 2016-03-08 18:16:27 -05:00
Jeff Becker
9aab7addb1 update dayman theme 2016-03-08 18:11:48 -05:00
Jeff Becker
0b984d0dcd color -> background-color 2016-03-08 18:10:03 -05:00
Jeff Becker
73b254367f update dayman theme 2016-03-08 18:09:27 -05:00
Jeff Becker
a9c09e57e9 dayman css initial 2016-03-08 18:02:33 -05:00
Jeff Becker
d8b57e2189 add default theme (yostuba) option 2016-03-08 17:02:23 -05:00
Jeff Becker
7ce22cefb7 try again inverting image colors via css 2016-03-08 16:58:47 -05:00
Jeff Becker
2de555f176 invert origin image color in bloodgod theme 2016-03-08 16:53:29 -05:00
Jeff Becker
68c071e318 don't use main/onload for theme application 2016-03-08 10:45:39 -05:00
Jeff Becker
077b61270c navbar on front page 2016-03-08 08:42:52 -05:00
Jeff Becker
5975383349 have navbar theme changer text underlined 2016-03-08 08:35:34 -05:00
Jeff Becker
46ca31066f add hover for navbar theme changers 2016-03-08 08:34:07 -05:00
Jeff Becker
9db627d07f update themes to be more consistant 2016-03-08 08:31:12 -05:00
Jeff Becker
014dbdfa95 add navbar to ukko 2016-03-08 08:25:31 -05:00
Jeff Becker
ea06f5498f add nntpchan.js stuff to mod panel 2016-03-08 08:13:57 -05:00
Jeff Becker
c2d60063ee add onload to modpage 2016-03-08 08:13:00 -05:00
Jeff Becker
0ebd2241e5 fix mod.js error 2016-03-08 07:25:54 -05:00
Jeff Becker
0aca177c86 fix color in bloodgod theme 2016-03-08 07:24:29 -05:00
Jeff Becker
9bb45cd896 update bloodgod theme 2016-03-08 07:23:18 -05:00
Jeff Becker
7458a884d5 add onload to frontpage too 2016-03-08 07:17:48 -05:00
Jeff Becker
6392a606c4 add onload to body 2016-03-07 21:00:54 -05:00
Jeff Becker
693bcdeffd try fixing localstorage again 2016-03-07 20:57:14 -05:00
Jeff Becker
81a398ab26 don't check for non existant key in localstorage 2016-03-07 20:55:46 -05:00
Jeff Becker
7296bc6944 fix localstorage 2016-03-07 20:55:05 -05:00
Jeff Becker
e97c4bab53 fix onload 2016-03-07 20:51:41 -05:00
Jeff Becker
2c03b8fd6b persist theme changes 2016-03-07 20:50:58 -05:00
Jeff Becker
2f3742fa7c update bloodgod theme 2016-03-07 20:41:10 -05:00
Jeff Becker
ff816fd556 update bloodgod theme 2016-03-07 20:37:38 -05:00
Jeff Becker
585d4cbff1 fix up bloodgod theme 2016-03-07 20:35:28 -05:00
Jeff Becker
0d388b19ee have bloodgod theme include buttons 2016-03-07 20:34:19 -05:00
Jeff Becker
a8e870a099 update bloodgod theme to include inputs and textares 2016-03-07 20:32:08 -05:00
Jeff Becker
32c4dcbe69 update bloodgood theme to apply to navbar 2016-03-07 20:29:00 -05:00
Jeff Becker
a3571f541b fix bloodgod theme background 2016-03-07 20:27:14 -05:00
Jeff Becker
39dbe314d6 ammend theme changing 2016-03-07 20:25:29 -05:00
Jeff Becker
63e2614983 try fixing theme switcher 2016-03-07 20:21:20 -05:00
Jeff Becker
0623077a40 add more themes and support for switching themes 2016-03-07 20:18:28 -05:00
Jeff Becker
f05d43af89 fix 2016-03-07 12:05:52 -05:00
Jeff Becker
68b73ff1dd fix 2016-03-07 12:03:27 -05:00
Jeff Becker
0613350420 fix 2016-03-07 12:00:32 -05:00
Jeff Becker
37af910c89 more nntp feed stuffs 2016-03-07 11:59:33 -05:00
Jeff Becker
6286a6529c disable checking for mod handler 2016-03-07 11:50:16 -05:00
Jeff Becker
51bdf9609f setinterval was backwards 2016-03-07 11:44:42 -05:00
Jeff Becker
b5d60f1431 syntax error 2016-03-07 11:43:11 -05:00
Jeff Becker
56f8fc8b91 add nntpchan feed ticker to mod panel 2016-03-07 11:42:21 -05:00
Jeff Becker
e0de5dfbf5 russian translations, thanks siger 2016-03-01 18:30:20 -05:00
Jeff Becker
d122da98b5 float: left for attachments 2016-02-29 09:07:42 -05:00
Jeff Becker
e6a38af5ee sorround attachments in div 2016-02-29 09:06:13 -05:00
Jeff Becker
abf3da5900 multiple files 2016-02-29 08:35:26 -05:00
Jeff Becker
a40aad33d1 * add 2 file support
* TODO: add nicer widget for multifile
2016-02-29 08:14:19 -05:00
Jeff Becker
9a6f3ef4ed add portugeese translations, thanks pyr 2016-02-28 10:16:47 -05:00
Jeff Becker
372a8767ee add es tranlsations, thanks trolly 2016-02-28 09:47:19 -05:00
Jeff
f7a31012e8 Merge pull request #48 from ZiRo-/master
Add internationalization
2016-02-28 08:13:55 -05:00
ZiRo
5cf11d50d4 Fix date format 2016-02-28 14:00:22 +01:00
ZiRo
a4f3e4ffa4 Fix date format 2016-02-28 13:59:38 +01:00
ZiRo
60de698f2c Add German translation 2016-02-28 13:57:51 +01:00
ZiRo
1c4f4630c2 localize templates 2016-02-28 13:40:16 +01:00
ZiRo
9974628f62 Make it possible to add more parameters to post template 2016-02-28 10:19:55 +01:00
ZiRo
2ea928417d Localize time formats 2016-02-28 09:48:07 +01:00
ZiRo
eede0c55dc Merge branch 'master' of github.com:ZiRo-/nntpchan 2016-02-28 08:55:33 +01:00
ZiRo
c6780cfd27 Merge remote-tracking branch 'upstream/master' 2016-02-28 08:54:23 +01:00
ZiRo
34b2e18587 Add dummy translation files 2016-02-28 08:54:05 +01:00
Jeff
38d3bc4481 Merge pull request #47 from ZiRo-/patch-1
Add RPC
2016-02-26 07:53:49 -05:00
ZiRo-
e556d6d2be Add RPC 2016-02-25 20:25:10 +01:00
ZiRo-
22a3564f22 Merge pull request #1 from majestrate/master
rebase
2016-02-25 20:02:06 +01:00
Jeff Becker
b695d97e82 even out front page 2016-02-22 07:39:06 -05:00
Jeff Becker
64e4c3320d fix front page 2016-02-22 07:32:49 -05:00
Jeff Becker
7c7d07434d undo changes with post form 2016-02-21 17:08:38 -05:00
Jeff Becker
d2b9e76389 update templates 2016-02-21 16:51:56 -05:00
Jeff Becker
f91bd642a5 fix moderate.js 2016-02-20 09:42:22 -05:00
Jeff Becker
9459e1758d fix moderate.js tool 2016-02-20 09:41:03 -05:00
Jeff Becker
24b2bd8e15 add moderate example script 2016-02-20 09:35:20 -05:00
Jeff
8ad13c8e45 Merge pull request #46 from ZiRo-/master
add images to catalog; style catalog properly
2016-02-20 13:54:16 +00:00
ZiRo
c6e6c2e5d6 Catalog improvements 2016-02-20 11:16:54 +01:00
Jeff
9690156fbf Merge pull request #45 from ZiRo-/master
Add catalog
2016-02-19 15:57:01 +00:00
ZiRo
dea611c1ba initial for catalog 2016-02-19 16:48:41 +01:00
Jeff Becker
0e0f35e6dc fix legal footer 2016-02-17 14:13:58 -05:00
Jeff Becker
5370898da9 * add legal notice
* fix front page graph
2016-02-17 14:10:50 -05:00
ZiRo
1020fae1dd Add Board titles 2016-02-17 15:31:28 +01:00
ZiRo
6bcfff0269 post form fixes 2016-02-17 15:06:00 +01:00
ZiRo
5fbf75a77d Add update link 2016-02-17 14:59:39 +01:00
ZiRo
86744c9349 fix posting form 2016-02-17 14:51:25 +01:00
ZiRo
24b6d87381 add page list to the bottom of board pages 2016-02-17 11:30:19 +01:00
ZiRo
649cc96269 add footer links to threads 2016-02-17 10:53:20 +01:00
ZiRo
a9e377563d Fix board list a bit 2016-02-17 10:27:16 +01:00
ZiRo
9229aa62bd Merge remote-tracking branch 'upstream/master' 2016-02-16 18:35:34 +01:00
ZiRo
f9c9028a0b The posts and threads are now pretty much done 2016-02-16 16:52:20 +01:00
ZiRo
5fa12dcda8 some more CSS fuckery 2016-02-16 16:37:02 +01:00
ZiRo
8c0a4ac6b0 crop i2p icon 2016-02-16 14:56:59 +01:00
ZiRo
bd279547d2 some css fuckery 2016-02-16 14:48:56 +01:00
Jeff Becker
1ad6432576 make reply button/link obvious 2016-02-16 08:32:51 -05:00
ZiRo
4b007fa759 Use 8chin post borders 2016-02-16 13:59:10 +01:00
ZiRo
abe985b6c5 Make origin icon smaller 2016-02-16 13:47:56 +01:00
ZiRo
6091934884 Make origin icon smaller 2016-02-16 13:47:30 +01:00
ZiRo
7db701b23a Don't use a maring for threads 2016-02-16 13:42:28 +01:00
Jeff Becker
00816c1a95 rename mod action 2016-02-15 17:04:59 -05:00
Jeff Becker
713f8a7d19 fix up ukko 2016-02-15 17:02:38 -05:00
Jeff Becker
da42b8fc7d fix ukko more 2016-02-15 17:00:35 -05:00
Jeff Becker
27bf7de803 style tweaks 2016-02-15 16:55:36 -05:00
Jeff Becker
4fd443dce4 tweaks 2016-02-15 16:53:17 -05:00
Jeff Becker
f8d3f85a4d fix typos 2016-02-15 16:52:38 -05:00
Jeff Becker
007851056f fix ukko 2016-02-15 16:50:52 -05:00
Jeff Becker
f97b5a56e5 uncomment out ukko threads header 2016-02-15 16:48:18 -05:00
Jeff Becker
7495c3e843 fix bad end tag 2016-02-15 16:44:35 -05:00
Jeff Becker
713ff950e7 fix origin icon more 2016-02-15 16:42:42 -05:00
Jeff Becker
64a7a6e6aa fix origin icons 2016-02-15 16:36:56 -05:00
Jeff Becker
6aa9475c91 * move origin image to be inside postheader
* style tweaks
2016-02-15 16:29:54 -05:00
Jeff Becker
a9ac1207c0 * add thumnail class to post thumbnails
* fix typo in css
2016-02-15 15:51:17 -05:00
ZiRo
539033ec6d looking pretty good by now 2016-02-15 21:20:37 +01:00
ZiRo
80041baf1e fix some colors 2016-02-15 20:00:56 +01:00
ZiRo
b83b21df59 some more styling 2016-02-15 19:04:03 +01:00
ZiRo
69c30e0685 no more br 2016-02-15 18:42:46 +01:00
ZiRo
0ed2bad9f1 no more rounded rectangles, stupid boarders or shadows 2016-02-15 18:38:32 +01:00
ZiRo
41d3cb467b seperator line for threads 2016-02-15 18:26:30 +01:00
ZiRo
476ae002c2 beginn style change 2016-02-15 18:14:22 +01:00
ZiRo
6f0b518391 ... and No. for everyone 2016-02-15 17:20:41 +01:00
ZiRo
f673a10768 Reply only for OP 2016-02-15 17:17:00 +01:00
ZiRo
8668d1aa08 fix backlinks & CSS classes 2016-02-15 17:06:59 +01:00
ZiRo
d2babe367b use proper timestamps + fix double prefix
This has the benefit that modern browsers see timestamps in their local time zone
2016-02-15 16:13:28 +01:00
ZiRo
3b5937f2d9 Add my rebuild script to gitignore 2016-02-15 15:54:43 +01:00
Jeff Becker
1896060218 fix post template to include prefix 2016-02-13 17:26:00 -05:00
Jeff Becker
9d2461c716 make build.sh verbose when doing go get 2016-02-09 09:02:33 -05:00
Jeff Becker
85d60a1928 fix up more 2016-02-08 15:05:57 -05:00
Jeff Becker
6eb42d4cf7 fix up lynxchan migrate script such that it exits 2016-02-08 14:09:30 -05:00
Jeff Becker
37df9ef131 fixes to migration script 2016-02-08 13:47:06 -05:00
Jeff Becker
450d07d6e5 fix typo 2016-02-08 13:10:26 -05:00
Jeff Becker
047a63ec20 add initial lynxhub importer 2016-02-08 12:42:25 -05:00
Jeff Becker
3821562cf6 add redis database documentation 2016-02-07 09:36:46 -05:00
Jeff Becker
85a968ad40 add cli docs 2016-02-01 21:27:14 -05:00
Jeff Becker
c169616471 add no attachments detection 2016-02-01 11:06:01 -05:00
Jeff Becker
c0d5800bd4 fix up readme 2016-01-23 11:08:00 -05:00
Jeff Becker
6bd5518249 clairity 2016-01-23 11:06:59 -05:00
Jeff Becker
b3da008694 add api docs 2016-01-23 11:06:10 -05:00
Jeff Becker
3a2529561f add comment 2016-01-23 10:58:14 -05:00
Jeff Becker
110e607839 add json api example 2016-01-23 10:57:27 -05:00
Jeff Becker
54fa915aeb add banners 2016-01-20 12:20:04 -05:00
Jeff Becker
273d28d237 same as last commit 2016-01-20 12:18:22 -05:00
Jeff Becker
ec56bbe8f9 center all banners 2016-01-20 12:18:04 -05:00
Jeff Becker
9340b9088e i hate js 2016-01-20 12:16:30 -05:00
Jeff Becker
329eca6af3 fix banner placements 2016-01-20 12:13:14 -05:00
Jeff Becker
06d4535eaa try fixing banners more 2016-01-20 12:11:38 -05:00
Jeff Becker
9f78414098 try usimg correct prefixes 2016-01-20 12:09:55 -05:00
Jeff Becker
97faee8d1d try fixing banners 2016-01-20 12:08:01 -05:00
Jeff Becker
33d95c2ef3 trying this 2016-01-20 12:04:22 -05:00
Jeff Becker
97ee132989 fix more again 2016-01-20 12:02:13 -05:00
Jeff Becker
ab3da1edee try fixing banners more 2016-01-20 12:00:28 -05:00
Jeff Becker
ba0f5471a3 try fixing banners more D: 2016-01-20 11:58:19 -05:00
Jeff Becker
9f84ab4ca9 try fixing banners 2016-01-20 11:52:04 -05:00
Jeff Becker
3274536134 revert banner injection 2016-01-20 11:49:38 -05:00
Jeff Becker
bc5b22f7a1 move banners arround 2016-01-20 11:49:23 -05:00
Jeff Becker
0199230489 fix banner inject function 2016-01-20 11:48:08 -05:00
Jeff Becker
98bb655a3c add banners 2016-01-20 11:42:18 -05:00
Jeff Becker
c4090303ec ammend todo 2016-01-19 09:05:03 -05:00
Jeff
0be5982d39 Merge pull request #44 from chen-chan/patch-2
typo: lable -> label
2016-01-17 18:43:14 -05:00
chen-chan
c7975c67ef typo: lable -> label 2016-01-15 21:12:56 +01:00
jeff
59173f055e add sync = 1 documentation 2016-01-13 00:22:08 -05:00
jeff
0b8c977aad add password auth docs 2016-01-12 18:02:01 -05:00
jeff
2c0426d1a4 change password field to use type="password" 2016-01-12 15:14:24 -05:00
jeff
e6de8a1d20 fix mod panel 2016-01-12 10:29:23 -05:00
jeff
9ebe7d7c5d add nntp login actions in mod panel 2016-01-12 10:23:36 -05:00
no
84626f6f96 add info for peering over internet with tls 2016-01-07 13:27:43 -05:00
no
3a35dc5575 add tls related stuff to .gitignore 2016-01-07 11:56:08 -05:00
no
13b8a18e21 detect webm/mp4 and set mime type correctly 2016-01-07 09:32:50 -05:00
no
4557503256 for plaintext posts add content-type header 2016-01-07 09:31:11 -05:00
no
689ced2ae4 Merge branch 'master' of https://github.com/majestrate/nntpchan 2016-01-06 16:18:34 -05:00
no
ccc5972e67 add attachment ability to archiver 2016-01-06 16:17:34 -05:00
Jeff
e07260d068 Merge pull request #43 from chen-chan/master
my shitty template btw. enjoy~ :3
2016-01-04 09:49:22 -05:00
chen-chan
7854b0b81d faq update 2016-01-04 14:53:56 +01:00
chen-chan
177e0156cc faq update 2016-01-04 14:50:41 +01:00
chen-chan
10d47779d3 faq update 2016-01-04 14:47:43 +01:00
chen-chan
d26d6ecacb faq update 2016-01-04 14:43:58 +01:00
chen-chan
85200d9284 faq tweak 2016-01-04 14:29:25 +01:00
chen-chan
8bcd0b790c gitignore /go and /srndv2 2016-01-04 13:20:59 +01:00
chen-chan
68e4e9162f rm xmas, change faq, frontpage 2016-01-04 13:19:47 +01:00
chen-chan
05d1290344 minor fix 2 2015-12-23 17:03:40 +01:00
chen-chan
d1bb6b59b0 minor fix 2015-12-23 16:59:18 +01:00
chen-chan
64111298f6 minor fixes 2015-12-23 16:53:36 +01:00
chen-chan
6df6fd807a xmas 2015-12-23 14:25:25 +01:00
chen-chan
d140c9ee99 little tweak: date and buttons 2015-12-23 13:05:58 +01:00
chen-chan
50fafb4531 wrong thread js path 2015-12-23 06:29:01 +01:00
chen-chan
5591b56df0 css and frontpage fixes 2015-12-23 06:08:00 +01:00
chen-chan
6041a7d608 wrong js dir 2015-12-23 05:43:58 +01:00
chen-chan
111522d08e workaroung static not being hosted recursively 2015-12-23 05:04:50 +01:00
chen-chan
7d89ab06c7 chen-chan got its own dir in static 2015-12-23 03:25:52 +01:00
chen-chan
cab35af8c4 merge 2015-12-23 03:03:13 +01:00
chen-chan
5abbe123c3 merge 2015-12-23 02:53:35 +01:00
chen-chan
404d9952f2 merge from upstream 2015-12-23 02:38:08 +01:00
chen-chan
a6b7235b12 add back default empty user.css 2015-12-23 01:40:11 +01:00
chen-chan
55f4461475 rename css file 2015-12-23 01:36:22 +01:00
chen-chan
bb1c6890ac change css filename 2015-12-23 01:33:03 +01:00
chen-chan
e545bab034 new template dir 2015-12-23 01:07:29 +01:00
chen-chan
21ec8e5f3a table css 2015-12-23 01:02:11 +01:00
Jeff
35c6875b00 Merge pull request #38 from chen-chan/patch-2
target="_blank" needs to be after href or it no werk
2015-12-20 21:42:31 -05:00
chen-chan
45f217fa78 target="_blank" needs to be after href or it no werk
tbh smh onii-fam

also figcaption is completely unnecessary here tbh.
2015-12-21 01:58:25 +01:00
Jeff
e6ca1b07ed Merge pull request #35 from 4cdn/patch-3
legibility
2015-11-23 16:54:47 -05:00
4cdn
3e3680c9be legibility 2015-11-23 16:49:05 -05:00
Jeff
7501dae72e Merge pull request #34 from 4cdn/patch-1
table color to one lolz had
2015-11-22 18:42:15 -05:00
4cdn
93328cb480 table color to one lolz had 2015-11-22 16:16:47 -05:00
179 changed files with 20421 additions and 641 deletions

29
.gitignore vendored
View File

@@ -8,10 +8,35 @@
.\#*
# srnd config files
*.ini
srnd.ini
feeds.ini
# default article store directory
articles
# generated files
webroot
webroot
# built binaries
go
srndv2
# private key
*.key
*.txt
# certificates
certs
rebuild.sh
vendor
.gx
# generated js
contrib/static/nntpchan.js
contrib/static/js/nntpchan.js
contrib/static/miner-js.js
#docs trash
doc/.trash

34
.gxignore Normal file
View File

@@ -0,0 +1,34 @@
#
# .gxignore for nntpchan repo
#
# emacs temp files
*~
\#*
.\#*
# srnd config files
srnd.ini
feeds.ini
# default article store directory
articles/
# generated files
webroot/
# built binaries
go/
srndv2
nntpchan
# private key
*.key
*.txt
# certificates
certs/
rebuild.sh
.git

View File

@@ -1,33 +1,56 @@
# NNTPChan #
NNTPChan
========
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.
**NNTPChan** (previously known as overchan) is a decentralized imageboard that uses the [NNTP protocol](https://en.wikipedia.org/wiki/Network_News_Transfer_Protocol) (network-news transfer protocol) 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/)
This repository contains resources used by the core daemon which is located on [GitHub](https://github.com/majestrate/srndv2) (for now) along with general documentation, [here](doc/).
## getting started ##
##Getting started
Get the dependancies
[This](doc) is a step-by-step guide for getting up-and-running with NNTPChan as well as documentation for developers who want to either work on NNTPChan directly or use NNTPChan in their aplications with the API.
sudo apt-get update
sudo apt-get --no-install-recommends install imagemagick libsodium-dev ffmpegthumbnailer sox build-essential git golang ca-certificates
##Bugs and issues
Check out this repo and build it
*PLEASE* report any bugs you find while building, setting-up or using NNTPChan on the [GitHub issue tracker](https://github.com/majestrate/nntpchan/issues) or on the [GitGud issue tracker](https://gitgud.io/uguu/nntpchan/issues) so that the probelms can be resolved or discussed.
git clone https://github.com/majestrate/nntpchan
cd nntpchan
./build.sh
##Active NNTPChan nodes
Now configure the database. [Next](doc/database.md)
Below is a list of known NNTPChan nodes:
1. [2hu-ch.org](https://2hu-ch.org)
2. [nsfl.tk](https://nsfl.tk)
3. [gchan](https://gchan.xyz/)
Tor node list:
1. [textpunk](http://ucavviu7wl6azuw7.onion/)
2. [chan](http://ev7fnjzjdbtu3miq.onion/)
3. [oniichan](http://sfw.oniichanylo2tsi4.onion/)
##Clients
NNTP (confirmed working):
* Thunderbird
Web:
* [Yukko](https://github.com/faissaloo/Yukko): ncurses based nntpchan web ui reader
---
##Support
*PLEASE* report any bugs you find while setting up or building [(here)](https://github.com/majestrate/nntpchan/issues) so that the problems get fixed :^)
Need help? Join us on IRC.
For peering requests, questions or support find me on [rizon](https://qchat.rizon.net/?channels=#nntpchan) as \__uguu\__
1. [freenode: #nntpchan](https://webchat.freenode.net/?channels=#nntpchan)
2. [rizon: #nntpchan](https://qchat.rizon.net/?channels=#nntpchan) - Most active
##Donations
Like this project? Fund it:
Like this project? Why not help by funding it?
bitcoin: 15yuMzuueV8y5vPQQ39ZqQVz5Ey98DNrjE
Bitcoin: [15yuMzuueV8y5vPQQ39ZqQVz5Ey98DNrjE](bitcoin://15yuMzuueV8y5vPQQ39ZqQVz5Ey98DNrjE)
##Acknowledgements
* [Deavmi](https://deavmi.carteronline.net/) - Making the documentation beautiful.

View File

@@ -1,6 +1,7 @@
## TODO ##
* extra stylesheets
* alternative templates
* more alternative templates
* javascript free mod panel
* liveui
* liveui
* easier peering

119
build-js.sh Executable file
View File

@@ -0,0 +1,119 @@
#!/usr/bin/env bash
neochan="yes"
if [ "$1" == "--disable-neochan" ] ; then
neochan="no"
fi
root=$(readlink -e "$(dirname "$0")")
set -e
if [ "x" == "x$root" ] ; then
root=$PWD/${0##*}
fi
cd "$root"
if [ -z "$GOPATH" ]; then
export GOPATH=$root/go
mkdir -p "$GOPATH"
fi
if [ ! -f "$GOPATH/bin/minify" ]; then
echo "set up minifiy"
go get -v github.com/tdewolff/minify/cmd/minify
fi
outfile="$PWD/contrib/static/nntpchan.js"
neochan_js_outfile="$PWD/contrib/static/neochan.js"
neochan_css_outfile="$PWD/contrib/static/neochan.css"
mini() {
echo "minify $1"
echo "" >> $2
echo "/* begin $1 */" >> $2
"$GOPATH/bin/minify" --mime=text/javascript >> $2 < $1
echo "" >> $2
echo "/* end $1 */" >> $2
}
css() {
echo "minify $1"
echo "" >> $2
echo "/* begin $1 */" >> $2
lessc $1 >> $2
echo "" >> $2
echo "/* end $1 */" >> $2
}
initfile() {
rm -f "$1"
echo '/*' >> "$1"
echo ' * For source code and license information please check https://github.com/majestrate/nntpchan' >> "$1"
brandingfile=./contrib/branding.txt
if [ -e "$brandingfile" ] ; then
echo ' *' >> "$1"
while read line; do
echo -n ' * ' >> "$1";
echo $line >> "$1";
done < $brandingfile;
fi
echo ' */' >> "$1"
}
echo
echo "building nntpchan.js ..."
echo
initfile "$outfile"
if [ -e ./contrib/js/contrib/*.js ] ; then
for f in ./contrib/js/contrib/*.js ; do
mini "$f" "$outfile"
done
fi
mini ./contrib/js/entry.js "$outfile"
# local js
for f in ./contrib/js/nntpchan/*.js ; do
mini "$f" "$outfile"
done
# vendor js
for f in ./contrib/js/vendor/*.js ; do
mini "$f" "$outfile"
done
if [ "$neochan" == "yes" ] ; then
set +e
for exe in lessc coffee ; do
which $exe &> /dev/null
if [ "$?" != "0" ] ; then
echo "$exe not installed";
exit 1
fi
done
echo
echo "building neochan.js ..."
echo
initfile "$neochan_js_outfile"
for f in ./contrib/js/neochan/*.coffee ; do
echo "compile $f"
coffee -cs < "$f" > "$f.js"
done
for f in ./contrib/js/neochan/*.js ; do
mini "$f" "$neochan_js_outfile"
done
echo
echo "building neochan.css ..."
echo
initfile "$neochan_css_outfile"
for f in ./contrib/js/neochan/*.less ; do
css "$f" "$neochan_css_outfile"
done
fi
echo
echo "ok"

110
build.sh
View File

@@ -1,8 +1,106 @@
#!/usr/bin/env bash
root=$(readlink -e "$(dirname "$0")")
set -e
root=$(readlink -e $(dirname $0))
cd $root
export GOPATH=$root/go
mkdir -p $GOPATH
go get -u github.com/majestrate/srndv2
cp -a $GOPATH/bin/srndv2 $root
if [ "" == "$root" ] ; then
root=$PWD/${0##*}
fi
cd "$root"
tags="-tags disable_redis"
help_text="usage: $0 [--disable-neochan]"
# check for help flags first
for arg in "$@" ; do
case $arg in
-h|--help)
echo "$help_text"
exit 0
;;
esac
done
rev="QmPAqM7anxdr1ngPmJz9J9AAxDLinDz2Eh9aAzLF9T7LNa"
ipfs="no"
rebuildjs="yes"
_next=""
unstable="no"
neochan="yes"
# check for build flags
for arg in "$@" ; do
case $arg in
"--disable-neochan")
neochan="no"
;;
"--unstable")
unstable="yes"
;;
"--no-js")
rebuildjs="no"
;;
"--ipfs")
ipfs="yes"
;;
"--revision")
_next="rev"
;;
"--revision=*")
rev=$(echo "$arg" | cut -d'=' -f2)
;;
*)
if [ "x$_next" == "xrev" ] ; then
rev="$arg"
fi
esac
done
if [ "$rev" == "" ] ; then
echo "revision not specified"
exit 1
fi
cd "$root"
if [ "$rebuildjs" == "yes" ] ; then
echo "rebuilding generated js..."
if [ "$neochan" == "no" ] ; then
./build-js.sh --disable-neochan
else
./build-js.sh
fi
fi
unset GOPATH
export GOPATH=$PWD/go
mkdir -p "$GOPATH"
if [ "$ipfs" == "yes" ] ; then
if [ ! -e "$GOPATH/bin/gx" ] ; then
echo "obtaining gx"
go get -u -v github.com/whyrusleeping/gx
fi
if [ ! -e "$GOPATH/bin/gx-go" ] ; then
echo "obtaining gx-go"
go get -u -v github.com/whyrusleeping/gx-go
fi
echo "building stable revision, this will take a bit. to speed this part up install and run ipfs locally"
mkdir -p "$GOPATH/src/gx/ipfs"
cd "$GOPATH/src/gx/ipfs"
"$GOPATH/bin/gx" get "$rev"
cd "$root"
go get -d -v
go build -v .
mv nntpchan srndv2
echo -e "Built\n"
echo "Now configure NNTPChan with ./srndv2 setup"
else
if [ "$unstable" == "yes" ] ; then
go get -u -v github.com/majestrate/srndv2/cmd/nntpchan
cp "$GOPATH/bin/nntpchan" "$root"
echo "built unstable, if you don't know what to do, run without --unstable"
else
go get -u -v github.com/majestrate/srndv2
cp "$GOPATH/bin/srndv2" "$root"
echo -e "Built\n"
echo "Now configure NNTPChan with ./srndv2 setup"
fi
fi

View File

@@ -0,0 +1,13 @@
[Unit]
Description=NNTPChan Server
Requires=redis_6379.service
[Service]
Type=simple
WorkingDirectory=/opt/nntpchan
ExecStart=/opt/nntpchan/srndv2 run
ExecStop=/bin/kill -15 $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,89 @@
<?php
function gennntp($headers, $files) {
if (count($files) == 0) {
}
else if (count($files) == 1 && $files[0]['type'] == 'text/plain') {
$content = $files[0]['text'] . "\r\n";
$headers['Content-Type'] = "text/plain; charset=UTF-8";
}
else {
$boundary = sha1($headers['Message-Id']);
$content = "";
$headers['Content-Type'] = "multipart/mixed; boundary=$boundary";
foreach ($files as $file) {
$content .= "--$boundary\r\n";
if (isset($file['name'])) {
$file['name'] = preg_replace('/[\r\n\0"]/', '', $file['name']);
$content .= "Content-Disposition: form-data; filename=\"$file[name]\"; name=\"attachment\"\r\n";
}
$type = explode('/', $file['type'])[0];
if ($type == 'text') {
$file['type'] .= '; charset=UTF-8';
}
$content .= "Content-Type: $file[type]\r\n";
if ($type != 'text' && $type != 'message') {
$file['text'] = base64_encode($file['text']);
$content .= "Content-Transfer-Encoding: base64\r\n";
}
$content .= "\r\n";
$content .= $file['text'];
$content .= "\r\n";
}
$content .= "--$boundary--\r\n";
}
//$headers['Content-Length'] = strlen($content);
$headers['Mime-Version'] = '1.0';
$headers['Date'] = date('r', $headers['Date']);
$out = "";
foreach ($headers as $id => $val) {
$val = str_replace("\n", "\n\t", $val);
$out .= "$id: $val\r\n";
}
$out .= "\r\n";
$out .= $content;
return $out;
}
function shoveitup($msg, $id) {
$s = fsockopen("tcp://localhost:1119");
fgets($s);
fputs($s, "MODE STREAM\r\n");
fgets($s);
fputs($s, "TAKETHIS $id\r\n");
fputs($s, $msg);
fputs($s, "\r\n.\r\n");
fgets($s);
fclose($s);
}
$time = time();
echo "\n@@@@ Thread:\n";
echo $m0 = gennntp(["From" => "czaks <marcin@6irc.net>", "Message-Id" => "<1234.0000.".$time."@example.vichan.net>", "Newsgroups" => "overchan.test", "Date" => time(), "Subject" => "None"],
[['type' => 'text/plain', 'text' => "THIS IS A NEW TEST THREAD"]]);
echo "\n@@@@ Single msg:\n";
echo $m1 = gennntp(["From" => "czaks <marcin@6irc.net>", "Message-Id" => "<1234.1234.".$time."@example.vichan.net>", "Newsgroups" => "overchan.test", "Date" => time(), "Subject" => "None", "References" => "<1234.0000.".$time."@example.vichan.net>"],
[['type' => 'text/plain', 'text' => "hello world, with no image :("]]);
echo "\n@@@@ Single msg and pseudoimage:\n";
echo $m2 = gennntp(["From" => "czaks <marcin@6irc.net>", "Message-Id" => "<1234.2137.".$time."@example.vichan.net>", "Newsgroups" => "overchan.test", "Date" => time(), "Subject" => "None", "References" => "<1234.0000.".$time."@example.vichan.net>"],
[['type' => 'text/plain', 'text' => "hello world, now with an image!"],
['type' => 'image/gif', 'text' => base64_decode("R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="), 'name' => "urgif.gif"]]);
echo "\n@@@@ Single msg and two pseudoimages:\n";
echo $m3 = gennntp(["From" => "czaks <marcin@6irc.net>", "Message-Id" => "<1234.1488.".$time."@example.vichan.net>", "Newsgroups" => "overchan.test", "Date" => time(), "Subject" => "None", "References" => "<1234.0000.".$time."@example.vichan.net>"],
[['type' => 'text/plain', 'text' => "hello world, now WITH TWO IMAGES!!!"],
['type' => 'image/gif', 'text' => base64_decode("R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="), 'name' => "urgif.gif"],
['type' => 'image/gif', 'text' => base64_decode("R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="), 'name' => "urgif2.gif"]]);
shoveitup($m0, "<1234.0000.".$time."@example.vichan.net>");
sleep(1);
shoveitup($m1, "<1234.1234.".$time."@example.vichan.net>");
sleep(1);
shoveitup($m2, "<1234.2137.".$time."@example.vichan.net>");
shoveitup($m3, "<1234.2131.".$time."@example.vichan.net>");

9842
contrib/js/contrib/jquery.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
3rd party javascript

11
contrib/js/entry.js Normal file
View File

@@ -0,0 +1,11 @@
onready_callbacks = [];
function onready(fnc) {
onready_callbacks.push(fnc);
}
function ready() {
for (var i = 0; i < onready_callbacks.length; i++) {
onready_callbacks[i]();
}
}

1
contrib/js/neochan/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.coffee.js

View File

@@ -0,0 +1 @@

View File

View File

@@ -0,0 +1,3 @@
# neochan javascript directory
sass files for neochan templates

View File

@@ -0,0 +1,41 @@
// call an api method
// handler(json_object) on success
// handler(null) on fail
function nntpchan_apicall(url, handler, err_handler) {
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (ajax.readyState == XMLHttpRequest.DONE ) {
var status = ajax.status;
var j = null;
if (status == 200) {
// found
try {
j = JSON.parse(ajax.responseText);
} catch (e) {} // ignore parse error
} else if (status == 410) {
if (err_handler) {err_handler("cannot fetch post: api disabled");}
return;
}
handler(j);
}
};
ajax.open("GET", url);
ajax.send();
}
// build post from json
// inject into parent
// if j is null then inject "not found" post
function nntpchan_buildpost(parent, j) {
var post = document.createElement("div");
if (j) {
// huehuehue
post.innerHTML = j.PostMarkup;
inject_hover_for_element(post);
} else {
post.setAttribute("class", "notfound post");
post.appendChild(document.createTextNode("post not found"));
}
parent.appendChild(post);
}

View File

@@ -0,0 +1,13 @@
var banner_count = 5;
// inject a banner into an element
function nntpchan_inject_banners(elem, prefix) {
var n = Math.floor(Math.random() * banner_count);
var banner = prefix + "static/banner_"+n+".jpg";
var e = document.createElement("img");
e.src = banner;
e.id = "nntpchan_banner";
elem.appendChild(e);
}

View File

@@ -0,0 +1,20 @@
function setSrcQuery(e, q) {
var src = e.src;
var p = src.indexOf('?');
if (p >= 0) {
src = src.substr(0, p);
}
e.src = src + "?" + q
}
function reload(el) {
setSrcQuery(el, "reload=" + (new Date()).getTime());
return false;
}
onready(function(){
document.getElementById("captcha_img").onclick = function() {
reload(document.getElementById("captcha_img"));
};
});

View File

@@ -0,0 +1,70 @@
//
// expand images inline
//
// released into the public domain by Jeff on 2016-04-30
//
// is the filename matching an image?
function filenameIsImage(fname) {
return /\.(gif|jpeg|jpg|png|webp)/.test(fname.toLowerCase());
}
// setup image inlining for 1 element
function setupInlineImage(thumb, url) {
if(thumb.inlineIsSetUp) return;
thumb.inlineIsSetUp = true;
var img = thumb.querySelector("img.thumbnail");
var expanded = false;
var oldurl = img.src;
thumb.onclick = function() {
if (expanded) {
img.setAttribute("class", "thumbnail");
img.src = oldurl;
expanded = false;
} else {
img.setAttribute("class", "expanded-thumbnail");
img.src = url;
expanded = true;
}
return false;
}
}
// set up image inlining for all applicable children in an element
function setupInlineImageIn(element) {
var thumbs = element.querySelectorAll("a.file");
for ( var i = 0 ; i < thumbs.length ; i++ ) {
var url = thumbs[i].href;
if (filenameIsImage(url)) {
// match
console.log("matched url", url);
setupInlineImage(thumbs[i], url);
}
}
}
onready(function(){
// Setup Javascript events for document
setupInlineImageIn(document);
// Setup Javascript events via updatoer
if (window.MutationObserver) {
var observer = new MutationObserver(function(mutations) {
for (var i = 0; i < mutations.length; i++) {
var additions = mutations[i].addedNodes;
if (additions == null) continue;
for (var j = 0; j < additions.length; j++) {
var node = additions[j];
if (node.nodeType == 1) {
setupInlineImageIn(node);
}
}
}
});
observer.observe(document.body, {childList: true, subtree: true});
}
});

View File

@@ -0,0 +1,246 @@
/* This file is dedicated to the public domain; you may do as you wish with it. */
/* Note: This code expects the global variable configRoot to be set. */
var configRoot = "";
if (typeof _ == 'undefined') {
var _ = function(a) { return a; };
}
function setupVideo(thumb, url) {
if (thumb.videoAlreadySetUp) return;
thumb.videoAlreadySetUp = true;
var video = null;
var videoContainer, videoHide;
var expanded = false;
var hovering = false;
//var loop = setting("videoloop");
var loop = true;
var loopControls = [document.createElement("span"), document.createElement("span")];
var fileInfo = thumb.parentNode.querySelector(".fileinfo");
var mouseDown = false;
function unexpand() {
if (expanded) {
expanded = false;
if (video.pause) video.pause();
videoContainer.style.display = "none";
thumb.style.display = "inline";
video.style.maxWidth = "inherit";
video.style.maxHeight = "inherit";
}
}
function unhover() {
if (hovering) {
hovering = false;
if (video.pause) video.pause();
videoContainer.style.display = "none";
video.style.maxWidth = "inherit";
video.style.maxHeight = "inherit";
}
}
// Create video element if does not exist yet
function getVideo() {
if (video == null) {
video = document.createElement("video");
video.src = url;
video.loop = loop;
video.innerText = _("Your browser does not support HTML5 video.");
videoHide = document.createElement("img");
videoHide.src = configRoot + "static/collapse.gif";
videoHide.alt = "[ - ]";
videoHide.title = "Collapse video";
videoHide.style.marginLeft = "-15px";
videoHide.style.cssFloat = "left";
videoHide.addEventListener("click", unexpand, false);
videoContainer = document.createElement("div");
videoContainer.style.paddingLeft = "15px";
videoContainer.style.display = "none";
videoContainer.appendChild(videoHide);
videoContainer.appendChild(video);
thumb.parentNode.insertBefore(videoContainer, thumb.nextSibling);
// Dragging to the left collapses the video
video.addEventListener("mousedown", function(e) {
if (e.button == 0) mouseDown = true;
}, false);
video.addEventListener("mouseup", function(e) {
if (e.button == 0) mouseDown = false;
}, false);
video.addEventListener("mouseenter", function(e) {
mouseDown = false;
}, false);
video.addEventListener("mouseout", function(e) {
if (mouseDown && e.clientX - video.getBoundingClientRect().left <= 0) {
unexpand();
}
mouseDown = false;
}, false);
}
}
// Clicking on thumbnail expands video
thumb.addEventListener("click", function(e) {
if (!e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
getVideo();
expanded = true;
hovering = false;
video.style.position = "static";
video.style.pointerEvents = "inherit";
video.style.display = "inline";
videoHide.style.display = "inline";
videoContainer.style.display = "block";
videoContainer.style.position = "static";
video.parentNode.parentNode.removeAttribute('style');
thumb.style.display = "none";
//video.muted = (setting("videovolume") == 0);
//video.volume = setting("videovolume");
video.controls = true;
if (video.readyState == 0) {
video.addEventListener("loadedmetadata", expand2, false);
} else {
setTimeout(expand2, 0);
}
video.play();
e.preventDefault();
}
}, false);
function expand2() {
video.style.maxWidth = "100%";
video.style.maxHeight = window.innerHeight + "px";
var bottom = video.getBoundingClientRect().bottom;
if (bottom > window.innerHeight) {
window.scrollBy(0, bottom - window.innerHeight);
}
// work around Firefox volume control bug
//video.volume = Math.max(setting("videovolume") - 0.001, 0);
//video.volume = setting("videovolume");
}
// Hovering over thumbnail displays video
thumb.addEventListener("mouseover", function(e) {
//if (setting("videohover")) {
if (false) { // DOESN'T WORK YET
getVideo();
expanded = false;
hovering = true;
var docRight = document.documentElement.getBoundingClientRect().right;
var thumbRight = thumb.querySelector("img, video").getBoundingClientRect().right;
var maxWidth = docRight - thumbRight - 20;
if (maxWidth < 250) maxWidth = 250;
video.style.position = "fixed";
video.style.right = "0px";
video.style.top = "0px";
var docRight = document.documentElement.getBoundingClientRect().right;
var thumbRight = thumb.querySelector("img, video").getBoundingClientRect().right;
video.style.maxWidth = maxWidth + "px";
video.style.maxHeight = "100%";
video.style.pointerEvents = "none";
video.style.display = "inline";
videoHide.style.display = "none";
videoContainer.style.display = "inline";
videoContainer.style.position = "fixed";
//video.muted = (setting("videovolume") == 0);
//video.volume = setting("videovolume");
video.controls = false;
video.play();
}
}, false);
thumb.addEventListener("mouseout", unhover, false);
// Scroll wheel on thumbnail adjusts default volume
thumb.addEventListener("wheel", function(e) {
//if (setting("videohover")) {
if (true) {
//var volume = setting("videovolume");
if (e.deltaY > 0) volume -= 0.1;
if (e.deltaY < 0) volume += 0.1;
if (volume < 0) volume = 0;
if (volume > 1) volume = 1;
if (video != null) {
video.muted = (volume == 0);
video.volume = volume;
}
//changeSetting("videovolume", volume);
e.preventDefault();
}
}, false);
// [play once] vs [loop] controls
/*function setupLoopControl(i) {
loopControls[i].addEventListener("click", function(e) {
loop = (i != 0);
thumb.href = thumb.href.replace(/([\?&])loop=\d+/, "$1loop=" + i);
if (video != null) {
video.loop = loop;
if (loop && video.currentTime >= video.duration) {
video.currentTime = 0;
}
}
loopControls[i].style.fontWeight = "bold";
loopControls[1-i].style.fontWeight = "inherit";
}, false);
}
loopControls[0].textContent = _("[play once]");
loopControls[1].textContent = _("[loop]");
loopControls[(setting("videoloop") ? 1 : 0)].style.fontWeight = "bold";
for (var i = 0; i < 2; i++) {
setupLoopControl(i);
loopControls[i].style.whiteSpace = "nowrap";
fileInfo.appendChild(document.createTextNode(" "));
fileInfo.appendChild(loopControls[i]);
}*/
}
function setupVideosIn(element) {
var thumbs = element.querySelectorAll("a.file");
for (var i = 0; i < thumbs.length; i++) {
if (/(\.webm)|(\.mp4)$/.test(thumbs[i].pathname)) {
setupVideo(thumbs[i], thumbs[i].href);
} else {
var url = thumbs[i].href;
if (/(\.webm)|(\.mp4)$/.test(url)) setupVideo(thumbs[i], url);
}
}
}
onready(function(){
// Insert menu from settings.js
if (typeof settingsMenu != "undefined" && typeof Options == "undefined")
document.body.insertBefore(settingsMenu, document.getElementsByTagName("hr")[0]);
// Setup Javascript events for videos in document now
setupVideosIn(document);
// Setup Javascript events for videos added by updater
if (window.MutationObserver) {
var observer = new MutationObserver(function(mutations) {
for (var i = 0; i < mutations.length; i++) {
var additions = mutations[i].addedNodes;
if (additions == null) continue;
for (var j = 0; j < additions.length; j++) {
var node = additions[j];
if (node.nodeType == 1) {
setupVideosIn(node);
}
}
}
});
observer.observe(document.body, {childList: true, subtree: true});
}
});

View File

@@ -0,0 +1,206 @@
/** hidepost.js -- hides posts from page given $things */
function get_hidden_posts() {
var st = get_storage();
var prefix = "nntpchan_hide_post_";
return {
all : function() {
var msgids = [];
for ( var k in st) {
if (k.indexOf(prefix) == 0) {
var m = k.substring(prefix.length);
msgids.push(m);
}
}
return msgids;
},
add : function (msg) {
st[prefix+msg] = "post";
},
del : function (msg) {
st.removeItem(prefix+msg);
}
}
}
// is a post elem an OP?
function postIsOP(elem) {
var ds = elem.dataset;
return ds && ds.rootmsgid == ds.msgid ;
}
function _hide_elem(elem, fade) {
if(!fade) {
if (elem.style) {
elem.style.display = "none";
} else {
elem.style = {display: "none" };
}
elem.dataset.userhide = "yes";
} else {
$(elem).fadeOut(400, function() {
_hide_elem(elem);
});
}
}
function _unhide_elem(elem) {
$(elem).fadeIn();
elem.dataset.userhide = "no";
}
// return true if element is hidden
function _elemIsHidden(elem) {
return elem.dataset && elem.dataset.userhide == "yes";
}
// hide a post
function hidepost(elem, nofade) {
console.log("hidepost("+elem.dataset.msgid+")");
var posts = get_hidden_posts();
if (posts) {
// add to persitant hide
posts.add(elem.dataset.msgidhash);
}
if(postIsOP(elem)) {
// hide thread it's an OP
var thread = document.getElementById("thread_"+elem.dataset.rootmsgidhash);
if (thread) {
var e = thread.getElementsByClassName("post");
for ( var idx = 0; idx < e.length ; idx ++ ) {
if (e[idx].dataset.msgid == elem.dataset.msgid) continue; // don't apply
hidepost(e[idx]);
}
}
}
// hide attachments and post body
var es = elem.getElementsByClassName("attachments");
for (var idx = 0; idx < es.length ; idx ++ ) {
_hide_elem(es[idx], !nofade);
}
es = elem.getElementsByClassName("post_body");
for (var idx = 0; idx < es.length ; idx ++ ) {
_hide_elem(es[idx], !nofade);
}
es = elem.getElementsByClassName("postheader");
for (var idx = 0; idx < es.length ; idx ++ ) {
_hide_elem(es[idx], !nofade);
}
elem.dataset.userhide = "yes";
elem.setHideLabel("[show]");
}
// unhide a post
function unhidepost(elem) {
console.log("unhidepost("+elem.dataset.msgid+")");
var posts = get_hidden_posts();
if (posts) {
// remove from persiting hide
posts.del(elem.dataset.msgidhash);
}
if(postIsOP(elem)) {
var thread = document.getElementById("thread_"+elem.dataset.rootmsgidhash);
if(thread) {
var e = thread.getElementsByClassName("post");
for ( var idx = 0; idx < e.length ; idx ++ ) {
if(e[idx].dataset.msgid == elem.dataset.msgid) continue;
unhidepost(e[idx]);
}
}
}
// unhide attachments and post body
var es = elem.getElementsByClassName("attachments");
for (var idx = 0; idx < es.length ; idx ++ ) {
_unhide_elem(es[idx]);
}
es = elem.getElementsByClassName("post_body");
for (var idx = 0; idx < es.length ; idx ++ ) {
_unhide_elem(es[idx]);
}
es = elem.getElementsByClassName("postheader");
for (var idx = 0; idx < es.length ; idx ++ ) {
_unhide_elem(es[idx]);
}
elem.dataset.userhide = "no";
elem.setHideLabel("[hide]");
}
// hide a post given a callback that checks each post
function hideposts(check_func) {
var es = document.getElementsByClassName("post");
for ( var idx = 0; idx < es.length ; idx ++ ) {
var elem = es[idx];
if(check_func && elem && check_func(elem)) {
hidepost(elem);
}
}
}
// unhide all posts given callback
// if callback is null unhide all
function unhideall(check_func) {
var es = document.getElementsByClassName("post");
for (var idx=0 ; idx < es.length; idx ++ ) {
var elem = es[idx];
if(!check_func) { unhide(elem); }
else if(check_func(elem)) { unhide(elem); }
}
}
// inject posthide into page
onready(function() {
var posts = document.getElementsByClassName("post");
for (var idx = 0 ; idx < posts.length; idx++ ) {
console.log("inject hide: "+posts[idx].dataset.msgid);
var inject = function (elem) {
var hider = document.createElement("a");
hider.setAttribute("class", "hider");
elem.setHideLabel = function (txt) {
var e_hider = hider;
e_hider.innerHTML = txt;
}
elem.hidepost = function() {
var e_self = elem;
var e_hider = hider;
hidepost(e_self);
}
elem.unhidepost = function() {
var e_self = elem;
var e_hider = hider;
unhidepost(e_self);
}
elem.isHiding = function() {
var e_self = elem;
return _elemIsHidden(e_self);
}
hider.appendChild(document.createTextNode("[hide]"));
hider.onclick = function() {
var e_self = elem;
if(e_self.isHiding()) {
e_self.unhidepost();
} else {
e_self.hidepost();
}
}
elem.appendChild(hider);
};
inject(posts[idx]);
}
// apply persiting hidden posts
var posts = get_hidden_posts();
if(posts) {
var all = posts.all();
for ( var idx = 0 ; idx < all.length; idx ++ ) {
var id = all[idx];
var elem = document.getElementById(id);
if(elem)
hidepost(elem, true);
}
}
});

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,10 @@
function get_storage() {
var st = null;
if (window.localStorage) {
st = window.localStorage;
} else if (localStorage) {
st = localStorage;
}
return st;
}

View File

@@ -0,0 +1,65 @@
function livechan_got_post(widget, j) {
// do scroll
while (widget.children.length > 5) {
// remove top element
widget.removeChild(widget.children[0]);
}
nntpchan_buildpost(widget, j);
// scroll to bottom
widget.scrollTop = widget.scrollHeight;
}
// inject post form into an element
function inject_postform(prefix, parent) {
}
// inject livechan widget into parent
function inject_livechan_widget(prefix, parent) {
if ( "WebSocket" in window ) {
var url = "ws://"+document.location.host+prefix+"live";
if ( document.location.protocol == "https:" ) {
url = "wss://"+document.location.host+prefix+"live";
}
var socket = new WebSocket(url);
var progress = function(str) {
parent.innerHTML = "<pre>livechan: "+str+"</pre>";
};
progress("initialize");
socket.onopen = function () {
progress("streaming");
}
socket.onmessage = function(ev) {
var j = null;
try {
j = JSON.parse(ev.data);
} catch(e) {
// ignore
}
if (j) {
livechan_got_post(parent, j);
}
}
socket.onclose = function(ev) {
progress("connection closed");
setTimeout(function() {
inject_livechan_widget(prefix, parent);
}, 1000);
}
} else {
parent.innerHTML = "<pre>livechan mode requires websocket support</pre>";
setTimeout(function() {
parent.innerHTML = "";
}, 5000);
}
}
function ukko_livechan(prefix) {
var ukko = document.getElementById("ukko_threads");
if (ukko) {
// remove children
ukko.innerHTML = "";
inject_livechan_widget(prefix, ukko);
}
}

View File

@@ -0,0 +1 @@
main nntpchan javascript files

View File

@@ -0,0 +1,426 @@
function getReplyTo() {
if(!document.dynreply) {
var e = document.getElementById("postform_container");
if (e) {
// use existing postform
document.dynreply = new DynReply(e);
} else {
// build a new postform
document.dynreply = new DynReply();
}
e = document.dynreply.elem;
e.style.position = "fixed";
e.setAttribute("class", "shadow");
}
return document.dynreply;
}
function table_insert_row(table, header, items) {
var tr = document.createElement("tr");
// insert header element
var th = document.createElement("th");
th.appendChild(header);
tr.appendChild(th);
// insert the rest of the elements
for (var idx = 0; idx < items.length; idx ++ ) {
var elem = document.createElement("td");
elem.appendChild(items[idx]);
tr.appendChild(elem);
}
table.appendChild(tr);
}
/**
build dynamic reply box
*/
function DynReply(existingElem) {
if (existingElem) {
// wrap existing post form
// XXX: wrap it here
this.elem = existingElem;
this.form = this.elem.querySelector("form");
this._error = document.getElementById("postform_msg");
this.url = this.form.action + "?t=json";
this.x = 1;
this.y = 1;
return;
}
// build new post form
var elem = document.createElement("div");
elem.setAttribute("id", "postform_container");
this.elem = elem;
// build post form
this.form = document.createElement("form");
this.form.enctype = "multipart/form-data";
this.form.name = "post";
this.form.method = "post";
// reference
elem = document.createElement("input");
elem.setAttribute("id", "postform_reference");
elem.name = "reference";
elem.type = "hidden";
this.form.appendChild(elem);
var table = document.createElement("table");
table.setAttribute("class", "postform");
var tbody = document.createElement("tbody");
var span = document.createElement("span");
// name
elem = document.createElement("input");
elem.setAttribute("name", "name");
elem.setAttribute("value", "Anonymous");
elem.setAttribute("id", "postform_name");
span.appendChild(elem);
// error message
var err_elem = document.createElement("span");
err_elem.setAttribute("id", "postform_msg");
span.appendChild(err_elem);
this._error = err_elem;
table_insert_row(tbody, document.createTextNode("Name"), [span])
// subject
elem = document.createElement("input");
elem.setAttribute("name", "subject");
elem.setAttribute("value", "");
elem.setAttribute("id", "postform_subject");
// submit
var submit = document.createElement("input");
submit.setAttribute("value", "reply");
submit.setAttribute("class", "button");
submit.setAttribute("type", "submit");
submit.setAttribute("id", "postform_submit");
table_insert_row(tbody, document.createTextNode("Subject"), [elem, submit]);
// Comment
elem = document.createElement("textarea");
elem.setAttribute("id", "postform_message");
elem.setAttribute("name", "message");
elem.setAttribute("cols", "40");
elem.setAttribute("rows", "5");
table_insert_row(tbody, document.createTextNode("Comment"), [elem]);
// file
elem = document.createElement("input");
elem.setAttribute("class", "postform_attachment");
elem.setAttribute("id", "postform_attachments");
elem.setAttribute("type", "file");
elem.setAttribute("name", "attachment_uploaded");
elem.setAttribute("multiple", "multiple");
table_insert_row(tbody, document.createTextNode("Files"), [elem]);
// dubs
elem = document.createElement("input");
elem.setAttribute("type", "checkbox");
elem.setAttribute("name", "dubs");
table_insert_row(tbody, document.createTextNode("Get Dubs"), [elem]);
// captcha
elem = document.createElement("img");
elem.setAttribute("id", "captcha_img");
elem.alt = "captcha";
table_insert_row(tbody, document.createTextNode("Captcha"), [elem]);
// captcha solution
elem = document.createElement("input");
elem.name = "captcha";
elem.autocomplete = "off";
elem.setAttribute("id", "captcha_solution");
table_insert_row(tbody, document.createTextNode("Solution"), [elem])
table.appendChild(tbody);
this.form.appendChild(table);
this.elem.appendChild(this.form);
document.body.appendChild(this.elem);
this.board = null;
this.roothash = null;
this.prefix = null;
this.url = null;
this.x = 1;
this.y = 1;
}
DynReply.prototype.update = function() {
if (this.prefix) {
// update captcha
this.updateCaptcha();
if (this.board) {
// update post form
var ref = document.getElementById("postform_reference");
if (this.roothash) {
ref.setAttribute("value", this.roothash);
} else {
ref.setAttribute("value", "");
}
this.url = this.prefix + "post/" + this.board + "?t=json";
}
}
}
DynReply.prototype.show = function() {
console.log("show dynreply");
this.update();
this.elem.style.display = 'inline';
}
DynReply.prototype.hide = function() {
console.log("hide dynreply");
this.elem.style.display = "none";
}
// clear all fields
DynReply.prototype.clear = function() {
this.clearSolution();
this.clearPostbox();
}
// clear captcha solution
DynReply.prototype.clearSolution = function() {
var e = document.getElementById("captcha_solution");
// reset value
e.value = "";
}
// clear postform elements
DynReply.prototype.clearPostbox = function() {
var e = document.getElementById("postform_subject");
e.value = "";
e = document.getElementById("postform_message");
e.value = "";
e = document.getElementById("postform_attachments");
e.value = null;
}
DynReply.prototype.post = function(cb, err_cb) {
if (this.url && this.form) {
var data = new FormData(this.form);
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function(ev) {
if (ajax.readyState == XMLHttpRequest.DONE) {
var j = null;
try {
j = JSON.parse(ajax.responseText);
cb(j);
} catch (e) {
if(err_cb) {
err_cb(e);
}
}
}
}
ajax.open("POST", this.url);
ajax.send(data);
}
}
DynReply.prototype.updateCaptcha = function() {
if (this.prefix) {
var captcha_img = document.getElementById("captcha_img");
captcha_img.src = this.prefix + "captcha/img";
}
this.clearSolution();
}
DynReply.prototype.setPrefix = function(prefix) {
this.prefix = prefix;
}
DynReply.prototype.hide = function() {
this.elem.style.display = 'none';
}
DynReply.prototype.setBoard = function(boardname) {
if (boardname) {
this.board = boardname;
}
}
DynReply.prototype.setRoot = function(roothash) {
if (roothash) {
this.roothash = roothash;
}
}
DynReply.prototype.showError = function(msg) {
console.log("error in dynreply: "+msg);
this._error.setAttribute("class", "error message");
this._error.appendChild(document.createTextNode(msg));
this.updateCaptcha();
}
DynReply.prototype.showMessage = function(msg) {
this._error.setAttribute("class", "message");
this._error.innerHTML = "";
this._error.appendChild(document.createTextNode(msg));
var e = this._error;
setTimeout(function() {
// clear it
e.innerHTML = "";
}, 2000);
}
// reply box function
function nntpchan_reply(parent, shorthash) {
if (parent && document.dynreply) {
var boardname = parent.getAttribute("boardname");
var roothash = parent.getAttribute("root");
var replyto = getReplyTo();
// set target
replyto.setBoard(boardname);
replyto.setRoot(roothash);
// show it
replyto.show();
}
var elem = document.getElementById("postform_message");
if ( elem )
{
elem.value += ">>" + shorthash.substr(0,10) + "\n";
}
}
// inject post hover behavior
function inject_hover(prefix, el, parent) {
if (!prefix) { throw "prefix is not defined"; }
var linkhash = el.getAttribute("backlinkhash");
if (!linkhash) { throw "linkhash undefined"; }
console.log("rewrite linkhash "+linkhash);
var elem = document.createElement("span");
elem.setAttribute("class", "backlink_rewritten");
elem.appendChild(document.createTextNode(">>"+linkhash.substr(0,10)));
if (!parent) {
parent = el.parentNode;
}
parent.removeChild(el);
parent.appendChild(elem);
elem.onclick = function(ev) {
if(parent.backlink) {
nntpchan_apicall(prefix+"api/find?hash="+linkhash, function(j) {
var wrapper = document.createElement("div");
wrapper.setAttribute("class", "hover "+linkhash);
if (j == null) {
// not found?
wrapper.setAttribute("class", "hover notfound-hover "+linkhash);
wrapper.appendChild(document.createTextNode("not found"));
} else {
// wrap backlink
nntpchan_buildpost(wrapper, j);
}
parent.appendChild(wrapper);
parent.backlink = false;
}, function(msg) {
var wrapper = document.createElement("div");
wrapper.setAttribute("class", "hover "+linkhash);
wrapper.appendChild(document.createTextNode(msg));
parent.appendChild(wrapper);
parent.backlink = false;
});
} else {
var elems = document.getElementsByClassName(linkhash);
if (!elems) throw "bad state, no backlinks open?";
for (var idx = 0 ; idx < elems.length; idx ++ ) {
elems[idx].parentNode.removeChild(elems[idx]);
}
parent.backlink = true;
}
};
parent.backlink = true;
}
// inject post hover for all backlinks in an element
function inject_hover_for_element(elem) {
var elems = elem.getElementsByClassName("backlink");
var ls = [];
var l = elems.length;
for ( var idx = 0 ; idx < l ; idx ++ ) {
var e = elems[idx];
ls.push(e);
}
for( var elem in ls ) {
inject_hover(prefix, ls[elem]);
}
}
function init(prefix) {
// because no one cares about this feature :|
return;
// inject posthover ...
inject_hover_for_element(document);
if ( /\.html$/.test(document.location.pathname) && ! (/ukko/.test(document.location.pathname)) ) {
// board / thread page
console.log("not loading reply widget");
} else {
// ukko / livechan page
var rpl = getReplyTo();
rpl.setPrefix(prefix);
// set livechan
rpl.setBoard("overchan.random");
rpl.update();
rpl.updateCaptcha();
// position replyto widget
var e = rpl.elem;
var mouseDownX, mouseDownY;
var $dragging = null;
$(rpl.elem).on("mousemove", function(ev) {
if ($dragging) {
var x = ev.pageX - $(this).width() / 2,
y = ev.pageY - $(this).height() / 2;
$dragging.offset({
top: y,
left: x
});
}
});
$(rpl.elem).on("mousedown", e, function (ev) {
$dragging = $(rpl.elem);
});
$(rpl.elem).on("mouseup", function (e) {
$dragging = null;
});
// add replyto post handlers
e = document.getElementById("postform_submit");
var postit = function() {
var f = document.querySelector("form");
// do ajax request to post data
var r = getReplyTo();
r.showMessage("posting... ");
r.post(function(j) {
if(j.error) {
// an error happened
r.showError(j.error);
} else {
// we're good
r.showMessage("posted :^)");
r.updateCaptcha();
r.clear();
}
}, function(err) {
r.showError(err);
r.clearSolution();
});
}
var f = document.querySelector("form");
f.onsubmit = function() {
postit();
return false;
}
}
}

View File

@@ -0,0 +1,15 @@
function enable_theme(prefix, name) {
if (prefix && name) {
var theme = document.getElementById("current_theme");
if (theme) {
theme.href = prefix + "static/"+ name + ".css";
var st = get_storage();
st.nntpchan_prefix = prefix;
st.nntpchan_theme = name;
}
}
}
// apply themes
var st = get_storage();
enable_theme(st.nntpchan_prefix, st.nntpchan_theme);

View File

@@ -0,0 +1,66 @@
var easiness = 55.0;
var miner_threads = 4;
var randoffs = 64;
/*
onready(function(){
document.getElementById("start_miner").onclick = function() {
var btn = document.getElementById("start_miner");
var label = btn.value;
btn.value = "..."
btn.disabled = true;
var b = new Uint8Array(randoffs);
window.crypto.getRandomValues(b);
var b_cur = 0;
var b_i = 0;
var tmp = new Uint8Array(randoffs+b_i+1);
tmp.set(b)
tmp[b.length]=0
b = tmp;
var workers = new Array(miner_threads);
var worker_cb = function(e) {
if (e.data[0] == "ok") {
miner_cb(e.data[1]);
btn.value=label;
btn.disabled = false;
for (i=0; i<miner_threads; i++) {
workers[i].terminate();
}
} else {
if (b_cur >= 256) {
var tmp = new Uint8Array(randoffs+b_i+1);
tmp.set(b)
tmp[b.length]=0
b = tmp;
b_i++;
b_cur=0;
}
b[randoffs+b_i]=b_cur;
b_cur++;
var params = [b, easiness, e.data[2]];
workers[e.data[2]].postMessage(params);
}
}
for (i=0; i<miner_threads; i++) {
b[randoffs+b_i]=b_cur;
b_cur++;
var params = [b, easiness, i];
workers[i] = new Worker("./static/mineworker.js");
workers[i].onmessage = worker_cb;
workers[i].postMessage(params); // Start the worker.
}
b_cur=4;
};
});
function miner_cb(s) {
document.getElementById("miner_result").value = s;
}
*/

View File

@@ -0,0 +1,2 @@
this directory holds unused javascript files for nntpchan
don't delete files move them here

2
contrib/js/readme.md Normal file
View File

@@ -0,0 +1,2 @@
javascript files for nntpchan

3
contrib/static/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
nntpchan.js
neochan.js
neochan.css

BIN
contrib/static/404.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

BIN
contrib/static/banner_0.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
contrib/static/banner_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
contrib/static/banner_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
contrib/static/banner_3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
contrib/static/banner_4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 550 B

After

Width:  |  Height:  |  Size: 135 B

112
contrib/static/bloodgod.css Normal file
View File

@@ -0,0 +1,112 @@
/**
bloodgod theme css override
*/
body {
color: #666;
background: #111;
}
.post_body > pre {
color: #666;
}
input, textarea, button, input[type="text"], input[type="password"],
input[type="checkbox"], input[type="file"], input[type="submit"],
input[type="button"] {
color: #666;
background: #050505;
border-color: #D80000;
}
.navbar {
background: #980000;
color: black;
}
#captcha_img {
background: #D80000;
}
.reply, .ukko_thread_header {
border-color: #0c0c0c;
}
.ukko_thread_header {
border-style: solid;
border-width: 1px;
border-radius: 3px;
}
hr, .name {
color: #6B1919;
}
hr {
height: 0px;
border-width: 1px medium medium;
border-color: #0C0C0C;
border-style: solid none none;
clear: both;
}
.subject {
color: #4E0000;
}
.reply , .ukko_thread_header {
background: #0C0C0C;
}
.op {
background-color: #1a1a1a;
border-style: hidden;
}
.pagelist {
background: #0c0c0c;
border-style: hidden;
}
a {
color: #500707;
}
.post:target {
background-color: #1a1a1a;
}
.postno, .postnol {
color: #B70000;
}
.postform >tr, th {
background: #6B1919;
}
#postform_container {
background-color: #111;
}
table tbody tr:nth-of-type( even ) {
background-color: #430000;
}
table thead th {
color: #6B1919;
background: #430000;
border-color: #270000;
}
.navbar-sep {
color: #270000;
}
.navbar-link > label:hover {
color: red;
}
.origin > img , .not_found > img {
-webkit-filter: invert(1);
filter: invert(1);
}

View File

@@ -0,0 +1,52 @@
<!doctype html><html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>nntpchan faq</title></head><body>
<audio loop controls><source src="/static/about.mp3" type="audio/mpeg">[can't play audio.]</audio>
<p>nntpchan faq</p>
<dl>
<dt>What is nntpchan?</dt>
<dd>NNTPCchan is a federated imageboard that spans across several networks including tor, i2p and anonet. There are no central servers so that as long as 1 server is left the forum will continue to function.</dd>
<br>
<dt>How is this different from *chan?</dt>
<dd>NNTPChan is by design invulnerable to global censorship. All moderation is local to each server.</dd>
<br>
<dt>How does moderation work then?</dt>
<dd>Moderation is done with our special tripcodes (ed25519-sha512 signed posts). Anyone can give moderation suggestions, but that doesn't mean anyone will accept them. Those who trust the actions of a moderator can have their frontend whitelist the moderation actions and have them performed without oversight by another moderator.</dd>
<br>
<dt>How can I remove content from nntpchan completely?</dt>
<dd>‾\(._.)/‾ I don't know. You probably can't unless every server agrees to remove the content, even then, nothing prevents someone from reposting it. You can't delete what you post on the internet.</dd>
<br>
<dt>do you allow child porn?</dt>
<dd>no.</dd>
<br>
<dt>Do you allow XYZ content?</dt>
<dd>If it violates USA Law or causes problems with my host, no. Otherwise, probably.</dd>
<br>
<dt>Someone posted something I don't like but it's not illegal</dt>
<dd>That is not my problem. All posts on this site are the responsibility of the individual poster and not the administration of this server</dd>
<br>
<dt>code, bugs, feature requests</dt>
<dd><a href="https://github.com/majestrate/nntpchan/">frontend</a> <a href="https://github.com/majestrate/srndv2/">core</a></dd>
<br></dl>
<p>Please send any gripes/questions/inqueries/suggestions/complaints to ampernand [|at\] gmail {dot} com with subject starting with "nntpchan question"</p>
<hr>
<p>ucavviu7wl6azuw7.onion frontend specific</p>
<dl>
<dt>admin's pubkey</dt>
<dd>06833a90237c61f59558c1726fbe71c63e972722b2cf1147867be286cb020b32<br>
▆☃►☐▣◼◡♵☕◘♁◲◯☾◱♆▾☗▧▢☲♏░◇☆◻♢☆♋▂▋▲</dd>
<br>
<dt>peering</dt>
<dd>just open a thread for now.</dd>
<br>
<dt>rules</dt>
<dd>basically no stuff that will fuck with the functioning of the site.<br>
- stuff that will get me in trouble like cp.<br>
- flood/spam. duplicate posts may also get baleeted.
</dd>
<br>
<dt>guidelines and things to keep in mind</dt>
<dd>
- i don't owe you shiieet. you don't owe me shieet.<br>
- administration style: benevolent dictatorship.
</dd>
</dl>
</body></html>

View File

@@ -0,0 +1,7 @@
body{font-family:monospace}
dl{max-width:84ch}
dd{margin-left:4ch;overflow:auto}
.memearrows{color:green}
pre{margin: 0 0 0 0}
table,th,td{border:1px solid gray}
table {border-collapse:collapse}

BIN
contrib/static/collapse.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 B

38
contrib/static/dayman.css Normal file
View File

@@ -0,0 +1,38 @@
/*
dayman
fighter of the night man
champion of the sun
*/
body {
background-color: #FFEFC9;
background-repeat: no-repeat;
background-attachment: fixed;
background-size: 100% 100%;
background-image: url('maymface.png');
}
.reply, .ukko_thread_header, th, .postform > tr , tbody > tr:nth-of-type( even ) {
background: #FBFFC9;
}
#postform_container {
background-color: rgba(0,0,0,0);
}
.post:target {
background-color: #ffda9b;
box-shadow: 0px 0px 5px 1px;
}
img#nntpchan_banner {
box-shadow: 0px 0px 10px 0px #FFECBE;
}
#postform_inner {
box-shadow: 0px 1px 5px 1px;
}
.navbar, table, thead, th, table, pre, .op {
background: #FFECBE;
}

View File

@@ -1,7 +1,9 @@
<!DOCTYPE html5>
<html>
<head>
<link rel="stylesheet" href="site.css" />
<title> NNTPChan Frequently Asked Questions </title>
<meta charset="utf-8">
</head>
<body>
<h2>NNTPChan faq </h2>
@@ -47,14 +49,6 @@
<div><a href="https://github.com/majestrate/nntpchan/issues">github</a></div>
</p>
<hr />
<p>
<div>Please send any gripes/questions/inqueries/suggestions/complaints to ampernand [|at\] gmail {dot} com with subject starting with "nntpchan question" </div>
</p>
<hr />
</div>
<audio autoplay="autoplay" loop="loop">
<source src="about.mp3" type="audio/mpeg">
<embed src="about.mp3">
</audio>
</body>
</html>

107
contrib/static/feed.js Normal file
View File

@@ -0,0 +1,107 @@
function createConnectionElement(j) {
var e = document.createElement("div");
e.setAttribute("class", "connection");
var auth = document.createElement("div");
auth.appendChild(document.createTextNode("Connection: "+j.name));
// authentication state
if (j.authed) {
auth.setAttribute("class", "authed");
auth.appendChild(document.createTextNode("(authenticated)"));
} else {
auth.appendChild(document.createTextNode("(not authenticated)"));
}
e.appendChild(auth);
// connection mode
var mode = document.createElement("div");
mode.setAttribute("class", "mode");
mode.appendChild(document.createTextNode("mode: "+j.mode));
e.appendChild(mode);
var pending = document.createElement("div");
pending.setAttribute("class", "pending");
// pending articles
var articles = Object.keys(j.pending);
pending.appendChild(document.createTextNode("pending articles: "+articles.length));
for ( var idx = 0 ; idx < articles.length; idx ++ ) {
var msgid = articles[idx];
var state = j.pending[msgid];
var elem = document.createElement("div");
elem.appendChild(document.createTextNode(msgid + ": " + state));
elem.setAttribute("class", "pending_item "+state);
pending.appendChild(elem);
}
e.appendChild(pending);
// e.appendChild(document.createTextNode(JSON.stringify(j)));
return e;
}
function inject_nntp_feed_element(feed, elem) {
elem.appendChild(document.createElement("hr"));
var name = document.createElement("div");
name.setAttribute("class", "feeds_name");
name_elem = document.createTextNode("Name: "+feed.State.Config.Name);
name.appendChild(name_elem);
elem.appendChild(name);
var conns = document.createElement("div");
conns.setAttribute("class", "connections");
for ( var idx = 0 ; idx < feed.Conns.length; idx ++ ) {
conns.appendChild(createConnectionElement(feed.Conns[idx]));
}
elem.appendChild(conns);
}
function update_nntpchan_feed_ticker(elem, result_elem) {
nntpchan_admin("feed.list", null, function(j) {
if (j) {
if (j.error) {
console.log("nntpchan_feed_ticker: error, "+j.error);
} else {
// remove all children
while(elem.children.length) {
elem.children[0].remove();
}
var result = j.result;
for (var idx = 0; idx < result.length; idx++) {
var item = result[idx];
var entry = document.createElement("div");
inject_nntp_feed_element(item, entry);
elem.appendChild(entry);
}
}
}
}, result_elem);
}
function nntp_feed_add() {
var param = {};
var e = document.getElementById("add_feed_name");
param.name = e.value;
e = document.getElementById("add_feed_host");
param.host = e.value;
e = document.getElementById("add_feed_port");
param.port = parseInt(e.value);
e = document.getElementById("nntpchan_feed_result");
nntpchan_admin("feed.add", param, null, e);
}
function nntp_feed_del() {
var e = document.getElementById("del_feed_name");
var name = e.value;
e = document.getElementById("nntpchan_feed_result");
nntpchan_admin("feed.del", {name: name}, null, e);
}
function nntp_feed_update() {
var e = document.getElementById("nntpchan_feeds");
if (e) {
setInterval(function(){
var e1 = document.getElementById("nntpchan_feed_result");
update_nntpchan_feed_ticker(e, e1);
}, 1000);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

249
contrib/static/livechan.css Normal file
View File

@@ -0,0 +1,249 @@
input {
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
}
.livechan_captcha_input {
color: black;
}
textarea, select {
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
}
.livechan_chat_input {
padding: 0;
margin: 0;
position: fixed;
width: 100%;
bottom: 0;
left: 0;
right: 0;
background: #d6daf0;
}
.livechan_chat_input_name, .livechan_chat_input_convo {
padding: 0;
padding-left: none;
margin: 0;
width: 80%;
color: black;
}
.livechan_chat_input_left {
width: 19%;
}
.livechan_chat_input_message_div {
padding:0;
margin:0;
position: absolute;
width: 70%;
left: 20%;
top: 3px;
bottom: 0;
}
.livechan_chat_input_message {
padding: 0;
margin: 0;
border:none;
height: 100%;
width: 100%;
resize: none;
}
.livechan_chat_input_submit {
position: absolute;
width: 8%;
top: 3px;
right: 1px;
bottom: 0;
border: none;
color: black;
}
.livechan_chat_output {
position: fixed;
top: 20px;
left: 0;
right: 0;
bottom: 60px;
overflow: auto;
width: 89%;
-webkit-overflow-scrolling: touch;
}
.livechan_chat_output_chat {
max-height: 200px;
overflow: hidden;
}
.livechan_chat_output_date {
margin: 0 4px;
}
.livechan_chat_output_count:hover {
cursor: pointer;
}
.livechan_chat_capcode {
margin: 0 4px;
font-style: italic;
font-weight: lighter;
}
.livechan_image_thumb {
max-width: 300px;
max-height: 200px;
float: left;
margin: 10px;
}
.livechan_captcha {
left: 0px;
top: 0px;
bottom: 0px;
right: 0px;
position: fixed;
opacity: 0.9;
}
.livechan_captcha_inner {
padding: 200px;
}
.livechan_captcha_image {
}
.livechan_captcha_input {
float: down;
}
.livechan_spoiler {
color: black;
background: black;
}
.livechan_chat_output_chat {
background: #d6daf0;
}
.livechan_spoiler:hover {
color: white;
}
.livechan_convo_label {
padding: 5px;
}
.livechan_convobar_root {
position: fixed;
top: 20px;
right: 0;
width: 10%;
}
.livechan_convobar_item {
padding: 5px;
margin: 5px;
background: #d6daf0;
}
.livechan_navbar {
z-index: 3;
position: fixed;
top: 0;
width: 100%;
height: 20px;
}
.livechan_navbar_mod_indicator_inactive, .livechan_navbar_mod_indicator_active, .livechan_navbar_status, .livechan_navbar_channel_label {
padding-left: 10px;
padding-right: 10px;
background: #d6daf0;
}
.hover {
position: relative;
padding: 1px;
left: -1000px
border: 1px dashed black;
visibility: hidden;
}
.hover > img {
position: fixed;
top: 0%;
right: 0;
max-width: 75%;
max-height: 75%;
visibility: visible;
}
.livechan_captcha, .livechan_convobar_root, #chat {
background: #EEF2FF;
}
.livechan_chat_output_chat {
font-family: monospace;
margin: 4px;
padding: 4px;
}
.livechan_chat_output_name {
font-weight: bold;
color: green;
}
.livechan_chat_output_count:hover {
color: red;
}
.livechan_greentext {
color: #789922;
}
.livechan_boldtext {
font-weight: bold;
}
.livechan_internallink , a {
color: blue;
}
.livechan_internallink:hover , a {
color: red;
cursor: pointer;
}
.livechan_chat_selected {
background: blue;
}
.livechan_navbar_mod_indicator_active {
background: #4a4ad4;
color: #34d434;
}
.livechan_navbar_mod_indicator_admin {
background: #4a4ad4;
color: red;
}
.livechan_navbar_mod_indicator_inactive {
color: #aaaaaa;
background: #EEF2FF;
}
.livechan_redtext {
color: #af0a0f;
font-weight: bold;
}

BIN
contrib/static/maymface.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View File

@@ -0,0 +1,8 @@
importScripts('./siphash-lib.js');
importScripts('./miner-js.js');
onmessage = function(e) {
var s = cuckoo["mine_cuckoo"](e.data[0], e.data[1]);
s.push(e.data[2]);
postMessage(s);
}

View File

@@ -64,28 +64,51 @@ function nntpchan_key_add() {
});
}
function get_nntp_username() {
var e = document.getElementById("nntpchan_nntp_username");
return e.value;
}
function get_nntp_passwd() {
var e = document.getElementById("nntpchan_nntp_passwd");
return e.value;
}
function nntpchan_admin_nntp(method) {
nntpchan_admin(method, {
username: get_nntp_username(),
passwd: get_nntp_passwd()
})
}
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) {
function nntpchan_admin(method, param, handler_cb, result_elem) {
if (handler_cb) {
// we got a handler already set
} else {
// no handler set
var handler_cb = function(j) {
if (j.result) {
return document.createTextNode(j.result);
} else {
return "nothing happened?";
}
}
}
nntpchan_mod({
name:"admin",
parser: function(target) {
return method;
},
handle: handler_cb,
method: ( param && "POST" ) || "GET",
data: param
})
}, result_elem)
}
@@ -119,70 +142,83 @@ function nntpchan_delete() {
});
}
function nntpchan_mod(mod_action) {
function nntpchan_mod(mod_action, result_elem) {
// get the element
var input = document.getElementById("nntpchan_mod_target");
var target = input.value;
var target = null;
if (input) {
target = input.value;
}
if (mod_action.parser) {
target = mod_action.parser(target);
}
var elem = document.getElementById("nntpchan_mod_result");
var elem;
if (result_elem) {
elem = result_elem;
} else {
elem = document.getElementById("nntpchan_mod_result");
}
// clear old results
while( elem.firstChild ) {
elem.removeChild(elem.firstChild);
}
// fire off ajax
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (ajax.readyState == XMLHttpRequest.DONE) {
var status = ajax.status;
// we gud?
if (status == 200) {
// yah
var txt = ajax.responseText;
var j = JSON.parse(txt);
if (j.error) {
var e = document.createTextNode(j.error);
elem.appendChild(e);
} else {
if (mod_action.handle) {
var result = mod_action.handle(j);
if (result) {
elem.appendChild(result);
var csrf_ajax = new XMLHttpRequest();
csrf_ajax.onreadystatechange = function() {
if (csrf_ajax.readyState == XMLHttpRequest.DONE) {
// get csrf token
var csrf = csrf_ajax.getResponseHeader("X-CSRF-Token");
// fire off ajax
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (ajax.readyState == XMLHttpRequest.DONE) {
var status = ajax.status;
// we gud?
if (status == 200) {
// yah
var txt = ajax.responseText;
var j = JSON.parse(txt);
if (j.error) {
var e = document.createTextNode(j.error);
elem.appendChild(e);
} else {
// fail
alert("mod action failed, handler returned nothing");
if (mod_action.handle) {
var result = mod_action.handle(j);
if (result) {
elem.appendChild(result);
}
}
}
} else {
// fail
alert("mod action has no handler");
} else if (status) {
// nah
// http error
elem.innerHTML = "error: HTTP "+status;
}
// clear input
if (input) {
input.value = "";
}
}
} else if (status) {
// nah
// http error
elem.innerHTML = "error: HTTP "+status;
}
// clear input
input.value = "";
if (mod_action.name) {
var url = mod_action.name + "/" + target;
ajax.open(mod_action.method || "GET", url);
ajax.setRequestHeader("X-CSRF-Token", csrf);
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");
}
}
}
if (mod_action.name) {
var url = mod_action.name + "/" + target;
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");
}
csrf_ajax.open("GET", "");
csrf_ajax.send();
}

View File

@@ -1,14 +0,0 @@
//
// 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.substr(0,10) + "\n";
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,94 @@
var SipHash = (function() {
function u8to64(p , i) {
return { l: (p[i] | p[i+1]<<8 | p[i+2]<<16 | p[i+3]<<24) , h: (p[i+4] | p[i+5]<<8 | p[i+6]<<16 | p[i+7]<<24) };
}
function _add(a, b) {
var rl = a.l + b.l,
a2 = { h: a.h + b.h + (rl / 2 >>> 31) >>> 0,
l: rl >>> 0 };
a.h = a2.h; a.l = a2.l;
}
function _xor(a, b) {
a.h ^= b.h; a.h >>>= 0;
a.l ^= b.l; a.l >>>= 0;
}
function _rotl(a, n) {
var a2 = {
h: a.h << n | a.l >>> (32 - n),
l: a.l << n | a.h >>> (32 - n)
};
a.h = a2.h; a.l = a2.l;
}
function _rotl32(a) {
var al = a.l;
a.l = a.h; a.h = al;
}
function _compress(v0, v1, v2, v3) {
_add(v0, v1);
_add(v2, v3);
_rotl(v1, 13);
_rotl(v3, 16);
_xor(v1, v0);
_xor(v3, v2);
_rotl32(v0);
_add(v2, v1);
_add(v0, v3);
_rotl(v1, 17);
_rotl(v3, 21);
_xor(v1, v2);
_xor(v3, v0);
_rotl32(v2);
}
function hash(v0h, v0l, v1h, v1l, v2h, v2l, v3h, v3l, mh, ml) {
var mi = { h: mh, l: ml };
var v0 = { h: v0h, l: v0l };
var v1 = { h: v1h, l: v1l };
var v2 = { h: v2h, l: v2l };
var v3 = { h: v3h, l: v3l };
/*var k0 = u8to64(key, 0);
var k1 = u8to64(key, 8);
var v0 = { h: k0.h, l: k0.l }, v2 = k0;
var v1 = { h: k1.h, l: k1.l }, v3 = k1;
_xor(v0, { h: 0x736f6d65, l: 0x70736575 });
_xor(v1, { h: 0x646f7261, l: 0x6e646f6d });
_xor(v2, { h: 0x6c796765, l: 0x6e657261 });
_xor(v3, { h: 0x74656462, l: 0x79746573 });*/
_xor(v3, mi);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_xor(v0, mi);
_xor(v2, { h: 0, l: 0xff });
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
var h = v0;
_xor(h, v1);
_xor(h, v2);
_xor(h, v3);
var res = new Uint32Array(2);
res[0]=h.h; res[1]=h.l;
return res;
};
return {
hash: hash,
};
})();
var module = module || { }, exports = module.exports = SipHash;

View File

@@ -1,10 +1,58 @@
body {
background: #EEF2FF url('bg.png') repeat-x 50% 0%;
color: black;
font-family: arial,helvetica,sans-serif;
font-size: 10pt;
margin: 0 4px;
padding-left: 4px;
padding-right: 4px;
}
.frontend , .subject {
color: #928BFF;
main,
aside,
section {
display: block;
margin: 0 auto;
width: 100%;
}
.hover {
position: absolute;
}
.notfound-hover {
background: #EEF2FF;
padding: 10px;
}
#postform_container {
background-color: #EEF2FF;
}
.shadow {
box-shadow: 0 0 10px rgba(0,0,0,0.55);
}
.hover > div > .post , .notfound-hover {
background-color: #D6DAF0;
box-shadow: 0 0 10px rgba(0,0,0,0.55);
}
.frontend , .subject, .catalog_subject {
color: #0F0C5D;
}
.name {
color: #117743;
padding-left: 5px;
}
.postno {
padding-right: 5px;
}
.error {
color: red;
}
.name , .subject {
@@ -15,13 +63,6 @@
text-align: center;
}
input {
width: 70%;
}
input.button {
width: 25%;
}
textarea {
width: 350px;
@@ -35,35 +76,112 @@ textarea {
padding: 10px 10px;
}
.download_link,.fname_link {
display: block;
text-align: center;
font-size: 90%;
height: auto
padding: 0.5em 0;
margin: auto;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
max-height: 2.4em;
}
.post_body > pre {
font-size: 10pt;
font-weight: unset;
}
pre {
white-space: pre-wrap;
background: #3f3f3f;
color: #d17600;
align: center;
font-size: 12pt;
color: black;
display: inline-block;
overflow-wrap: break-word;
word-wrap: break-word;
font-weight: bold;
font-family: sans;
margin-left: auto;
margin-right: auto;
}
td {
background-color: dimgrey;
table {
margin: auto;
}
table.board-list-table {
width: 100%;
}
.board_td {
position: relative; left: 2px;
table tbody td {
margin: 0;
padding: 4px 15px 4px 4px;
vertical-align: top;
text-align: left;
}
table thead th {
border: 1px solid #000333;
padding: 4px 15px 5px 5px;
background: #98E;
color: #000333;
text-align: left;
white-space: nowrap;
}
table tbody tr:nth-of-type( even ) {
background-color: #D6DAF0;
}
.posts_td {
position: relative; left: -2px;
.postform > tr, th {
background: #98E;
font-size: 10pt;
text-align: left;
padding-right: 10px;
padding-left: 4px;
}
#overview_graph {
position: relative;
top: 2px;
background: dimgrey;
.postform td{
padding: 0px 15px 0px 4px;
}
.button {
max-width: 10em;
height: 2em;
}
tr {
background-color: transparent!important;
}
input[type="text"],input[type="password"],textarea {
border: 1px solid #a9a9a9;
text-indent: 0;
text-shadow: none;
text-transform: none;
word-spacing: normal;
font-size: inherit;
font-family: sans-serif;
}
#board_td {
vertical-align: top;
}
.reply, .pagelist, .op {
background: #D6DAF0;
border-width: 1px;
border-style: none solid solid none;
border-color: #B7C5D9;
max-width: 94%!important;
}
.reply, .ukko_thread_header {
background: #202331;
background: #D6DAF0;
margin-left: 24px;
}
legend {
@@ -75,18 +193,78 @@ hr {
border-width: 1px medium medium;
border-color: #b7c5d9;
border-style: solid none none;
clear: both;
}
a:hover , a:visited:hover {
color: #f13333;
.board_header {
font-family: tahoma;
letter-spacing: -2px;
font-size: 20pt;
margin: 0;
color: #AF0A0F;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
a {
color: #0C2FF3;
.board_header_catalog {
text-align: center;
margin-top: 1em;
}
a:visited {
color: #5E00A0;
.catalog_thread {
display: inline-block;
width: 180px;
text-align: center;
padding: 0.25em;
height: 240px;
overflow: hidden;
background-color: rgba(182, 182, 182 ,0.12);
margin: 0.1em;
border: 2px solid rgba(111, 111, 111, 0.34);
}
.catalog_thread:hover {
background-color: #D6DAF0;
}
#catalog_container {
width: 95%;
margin: 1em auto;
text-align: center;
}
.catalog_header, .catalog_subject {
font-weight: bold;
}
.linkThumb img {
max-height: 128px;
max-width: 128px;
box-shadow: 0 0 4px rgba(0,0,0,0.55);
border: 2px solid rgba(153,153,153,0);
}
a:hover , a:visited:hover, .navbar-link > label:hover {
color: #ff0000;
}
a, a:visited, .navbar-link > label {
color: #34345C;
}
.postno {
font-style: italic;
}
.postno, .postnol, .postnol:visited {
color: black;
text-decoration: none;
}
.postno:hover, .postnol:hover, .postnol:visited:hover {
color: #ff0000;
text-decoration: underline;
}
.navbar {
@@ -96,70 +274,97 @@ a:visited {
right: 0px;
margin-top: 0px;
z-index: 20;
box-shadow: 0px 1px 20px rgba(0, 0, 0, 0.15);
background: #202331;
color: #616383;
box-shadow: 1px 10px 20px rgba(0, 0, 0, 0.15);
border-bottom: 1px solid;
background: #D6DAF0;
color: #34345C;
min-height: 20px;
padding-top: 2px;
}
.navbar-sep {
color: black;
color: darkgray;
}
.navbar-link > label {
text-decoration: underline;
}
#postform_container {
margin-top: 5em;
margin-top: 1em;
}
.navLinks {
padding-bottom: 50px;
}
.ukko_thread_header {
padding: 5px 5px;
margin: 5px 5px;
float: left;
clear: both;
display: inline-block;
}
th {
background: #4DA6BD;
font-size: 10pt;
padding-left: 10px;
padding-right: 15px;
}
input, textarea {
color: whitesmoke;
background: #2d2d2d;
border-color: #4D28CA;
border-radius: 3px;
}
html {
color: #ededed;
background: black;
height: 100%;
font-family: arial,helvetica,sans-serif;
font-size: 10pt;
margin: 0 4px;
padding-left: 4px;
padding-right: 4px;
}
.reply {
margin-left: 1.8em;
display: inline-block;
border-radius: 3px;
input, textarea {
}
.ukko_thread_header {
border-color: #C0C3D4;
border-top-left-radius: 0px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 0px;
border-style: dashed;
}
.frontend {
margin-top: 0px;
display: inline-block;
margin-right: 5px;
}
.op , .reply {
float: left;
clear: both;
}
.op {
margin-right: 20px;
margin-bottom: 10px;
margin-top: 5px;
margin-bottom: 1px;
}
.post:target {
background-color: #A99AFF;
}
.postreply {
float: right;
}
.post {
display: inline;
margin-bottom: 5px;
background-color: #D6DAF0;
border: 1px solid #B7C5D9;
border-left: none;
border-top: none;
display: table;
padding: 2px;
margin: 2px;
display: inline-block;
float: left;
clear: both;
min-width: 500px;
}
.postheader {
width: 100%;
padding-top: 3px;
padding-right: 5px
}
.tripcode {
@@ -187,14 +392,16 @@ html {
display: inline-block;
}
.memearrows {
color: #29D029;
color: #789922;
margin-left: none;
}
.redtext {
color: #d50505;
color: #AF0A0F;
font-size: 12pt;
font-weight: bold;
margin-left: none;
}
.spoiler {
@@ -219,34 +426,69 @@ html {
float: left;
}
.file-thumbnail {
display: block;
margin: 5px 20px 10px;
.expanded-thumbnail {
display: inline;
max-width: 100%;
max-height: 100%;
margin: 10px 10px 10px;
}
.thumbnail {
display: block;
margin: 5px 20px;
border: medium none;
max-width: 300px;
max-height: 200px;
}
.reply, .ukko_thread_header , pre {
padding: 7px 7px;
border-radius: 5px;
box-shadow: 1px 1px 3px black;
}
.post_body > p {
margin: 0px 0px;
.reply {
padding: 3px 5px 3px 5px;
float: left;
clear: both;
}
.post_body {
display: inline;
margin-left: 15px;
margin-top: 3px;
margin-bottom: 10px;
}
.post_body_line {
margin-left: inherit;
margin-top: 2px;
margin-bottom: 2px;
padding-top: 0px;
padding-bottom: 0px;
}
.post {
.pagelist {
display: inline-block;
width: 80%;
overflow: hidden;
margin-left: 15px;
margin-top: 20px;
margin-bottom: 50px;
padding: 10px 10px 10px 10px;
font-size: 12pt;
font-weight: medium;
}
#postform_attachment {
.backlink_rewritten {
z-index: 5;
}
.backlink, .backlink:hover, .backlink:visited, .backlink:visited:hover, .backlink_rewritten {
margin-left: none;
color: #D00
}
.origin > img{
height: 25px;
vertical-align: text-top;
margin-right: 5px;
}
.postform_attachment {
max-width: 330px;
}
@@ -257,45 +499,27 @@ html {
}
#captcha_img {
background: #4DA6BD;
background: white;
}
figure {
float: left;
margin: 1ex;
}
figure img {
max-width:256px;
max-height:128px;
max-width:100%;
}
fieldset {
overflow: auto;
border-radius: 5px 0px 5px 0px;
img.thumbnail {
max-width: 350px;
max-height: 350px;
}
fieldset > img {
float: right;
}
.thread {
float: left;
width: 90%;
padding-left: 10px;
margin-top: 10px;
margin-bottom: 10px;
background-color: #252525;
}
.replybar {
float: left;
position: fixed;
top: 2ex;
right: 0;
width: 34%
}
width: 500px;
}
@media (max-width: 100ex) {
.replybar, .thread {
.replybar {
width: 100%;
position: static;
}
@@ -318,6 +542,44 @@ textarea#reply-text {
right: 0;
}
hr {
padding-bottom: 20px;
#nntpchan_banner {
align: center;
}
.legal {
font-size: 10px;
text-align: center;
}
.attachments {
float: left;
margin-bottom: 5px;
}
.navbar-links, .navbar-link, .navbar-name {
padding-left: 2px;
padding-right: 2px;
}
.board_title {
padding-right: 4px;
}
.thread {
padding-left: 10px;
padding-top: 10px;
padding-bottom: 10px;
width: 80%;
}
.hider {
float: right;
}
@keyframes rotate {
0% { transform:rotate(0deg); }
25% { transform:rotate(-1deg); }
50% { transform:rotate(0deg); }
75% { transform:rotate(1deg); }
}

649
contrib/static/tomorrow.css Normal file
View File

@@ -0,0 +1,649 @@
body
{
background: #0B0B0B;
color: #DADADA;
font-family: arial, helvetica, sans-serif;
font-size: 10pt;
margin: 0 4px;
padding-left: 4px;
padding-right: 4px;
}
.post_body > pre {
color: #DADADA;
text-align: left;
}
main,
aside,
section
{
display: block;
margin: 0 auto;
width: 100%;
}
.frontend,
.subject,
.catalog_subject
{
color: #A03F4C;
}
.name
{
color: #117743;
}
.name,
.subject
{
font-weight: bold;
}
#postform-outer
{
text-align: center;
}
textarea
{
width: 350px;
}
#postform-inner
{
display: inline-block;
}
.post
{
padding: 10px 10px;
}
pre
{
white-space: pre-wrap;
text-align: center;
font-size: 13pt;
background: #98E;
color: black;
display: inline-block;
overflow-wrap: break-word;
word-wrap: break-word;
font-weight: bold;
padding: 20px 20px 20px 20px;
margin-left: auto;
margin-right: auto;
}
table
{
margin: auto;
}
table.board-list-table
{
width: 100%;
}
table tbody td
{
margin: 0;
padding: 4px 15px 4px 4px;
vertical-align: top;
text-align: left;
}
table thead th
{
background-color: #121212;
border: solid 1px #535353;
color: #DADADA;
text-align: left;
white-space: nowrap;
}
table tbody tr:nth-of-type( even)
{
background-color: #121212;
border: solid 1px #535353;
}
.postform >tr,
th
{
background-color: #121212;
border: solid 1px #535353;
color: #DADADA;
font-size: 10pt;
text-align: left;
padding-right: 10px;
padding-left: 4px;
}
#postform-inner tr
{
background-color: transparent!important;
}
input[type="text"],
input[type="password"],
textarea
{
text-indent: 0;
text-shadow: none;
text-transform: none;
word-spacing: normal;
font-size: inherit;
font-family: sans-serif;
}
#board_td
{
vertical-align: top;
}
.reply,
.pagelist
{
background: #D6DAF0;
border-width: 1px;
border-style: none solid solid none;
border-color: #B7C5D9;
display: inline-block;
max-width: 94%!important;
}
.reply,
.ukko_thread_header
{
background-color: #121212;
border: solid 1px #535353;
color: #DADADA;
margin-left: 24px;
}
hr
{
height: 0px;
border-width: 1px medium medium;
border-color: #b7c5d9;
border-style: solid none none;
clear: both;
}
.board_header
{
font-family: tahoma;
letter-spacing: -2px;
font-size: 20pt;
margin: 0;
color: #AF0A0F;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.board_header_catalog
{
text-align: center;
margin-top: 1em;
}
.catalog_thread
{
display: inline-block;
width: 180px;
text-align: center;
padding: 0.25em;
height: 240px;
overflow: hidden;
background-color: rgba(182, 182, 182, 0.12);
margin: 0.1em;
border: 2px solid rgba(111, 111, 111, 0.34);
}
.catalog_thread:hover
{
background-color: #D6DAF0;
}
#catalog_container
{
width: 95%;
margin: 1em auto;
text-align: center;
}
.catalog_header,
.catalog_subject
{
font-weight: bold;
}
.linkThumb img
{
max-height: 128px;
max-width: 128px;
box-shadow: 0 0 4px rgba(0, 0, 0, 0.55);
border: 2px solid rgba(153, 153, 153, 0);
margin-bottom: 5px;
}
a:hover,
a:visited:hover,
.navbar-link > label:hover
{
color: #ff0000;
}
a,
a:visited,
.navbar-link > label
{
color: #B8B8F7;
;
}
.postno
{
font-style: italic;
}
.postno,
.postnol,
.postnol:visited
{
color: #B8B8F7;
text-decoration: none;
}
.postno:hover,
.postnol:hover,
.postnol:visited:hover
{
color: #ff0000;
text-decoration: underline;
}
.navbar
{
position: fixed;
padding: 0.25em;
text-align: center;
top: 0px;
left: 0px;
right: 0px;
margin-top: 0px;
z-index: 20;
background-color: #121212;
border-bottom: solid 1px #535353;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
color: #B8B8F7;
}
.navbar-sep
{
color: darkgray;
}
.navbar-link > label
{
text-decoration: underline;
}
#postform_container
{
margin-top: 1em;
}
.navLinks
{
padding-bottom: 50px;
}
.ukko_thread_header
{
float: left;
clear: both;
display: inline-block;
padding-left: 4px;
padding-right: 4px;
}
input,
textarea
{
background-color: #121212;
border: solid 1px #535353;
color: #DADADA;
}
.ukko_thread_header
{
border-color: #C0C3D4;
border-top-left-radius: 0px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 0px;
border-style: dashed;
}
.frontend
{
margin-top: 0px;
display: inline-block;
}
.op
{
margin-bottom: 1px;
float: left;
clear: both;
background-color: #0f0f0f;
border-color: #242424;
}
pre {
background-color: #0f0f0f;
}
.post
{
margin-bottom: 5px;
min-width: 500px;
}
.postheader
{
padding-top: 3px;
padding-right: 5px
}
.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
{
animation: psych 2s linear infinite;
display: inline-block;
}
.memearrows
{
color: #789922;
margin-left: 0;
}
.redtext
{
color: #AF0A0F;
font-size: 12pt;
font-weight: bold;
margin-left: 0;
}
.spoiler
{
display: inline-block;
}
.spoiler > p
{
background: black;
color: black;
}
.spoiler:hover > p
{
background: black;
color: white;
}
.intro
{
margin-bottom: 0.75em;
}
.file:not(.multiple) .file-thumbnail
{
float: left;
}
.file-thumbnail
{
display: block;
margin: 5px 20px 10px;
border: medium none;
max-width: 300px;
max-height: 200px;
}
.reply
{
padding: 3px 5px 3px 5px;
float: left;
clear: both;
}
.post_body
{
margin-left: 15px;
margin-top: 3px;
margin-bottom: 10px;
}
.post_body_line
{
margin-left: inherit;
margin-top: 2px;
margin-bottom: 2px;
padding-top: 0px;
padding-bottom: 0px;
}
.post
{
display: inline-block;
overflow: hidden;
}
.pagelist
{
display: inline-block;
background-color: #121212;
border: solid 1px #535353;
color: #DADADA;
text-align: center;
overflow: hidden;
margin-left: 2em;
padding: 10px 10px 10px 10px;
font-weight: 700;
}
.backlink,
.backlink:hover,
.backlink:visited,
.backlink:visited:hover
{
margin-left: 0;
color: #D00
}
.origin > img
{
height: 20px;
vertical-align: text-top;
}
.postform_attachment
{
max-width: 330px;
}
#faq > div
{
margin-left: 20%;
width: 50%;
padding: 10px;
}
#captcha_img
{
background-color: #121212;
border: solid 1px #535353;
}
figure
{
float: left;
margin: 1ex;
}
img.thumbnail
{
max-width: 350px;
max-height: 350px;
}
.replybar
{
float: left;
position: fixed;
top: 2ex;
right: 0;
width: 34%
}
@media (max-width: 100ex)
{
.replybar
{
width: 100%;
position: static;
}
}
.hide-reply:checked ~ div
{
width: 100%;
position: static;
}
textarea#reply-text
{
width: 100%;
resize: vertical;
}
.hide-reply
{
float: right;
position: fixed;
top: 0;
right: 0;
}
#nntpchan_banner
{
text-align: center;
margin-top: 1em;
}
.legal
{
font-size: 10px;
text-align: center;
}
.attachments
{
float: left;
}
hr
{
border: 1px solid #535353;
height: 1px
}
img#nntpchan_banner {
box-shadow: 0px 0px 10px 0px;
}
#postform_container {
background-color: rgba(0, 0, 0, 0);
}
.post:target {
background-color: #2c2d3e;
box-shadow: 0px 0px 10px 2px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,27 @@
{{!
board.mustache, displays the contents of page N of the board
template parameters:
- board ( the model of the current page )
- page ( the page number of the current page )
board has the properties:
- Prefix ( absolute path like //site.tld/ or /path/ )
- Board ( the name of the board )
- Navbar ( a function that renders the navbar, should not be escaped )
- Threads ( a list of Thread Models with the last few replies )
}}
<!doctype html><html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>{{board.Board}}</title></head><body>
{{{board.Navbar}}}
{{{form}}}
<dl>
<hr>
{{#board.Threads}}
{{{OP.Truncate.RenderPost}}}
{{#Truncate.Replies}}
{{{Truncate.RenderPost}}}
{{/Truncate.Replies}}
<hr>
{{/board.Threads}}
</dl>
</body></html>

View File

@@ -0,0 +1,33 @@
{{!
boardlist.mustache -- full list of every board
template parameters:
- graph ( a list of 4 string tuples: (board, posts_per_hour, posts_per_day, total_posts) )
- frontend ( the name of the frontend )
- prefix ( the site's prefix )
}}
<!doctype html><html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>{{frontend}} boards</title></head><body>
<table>
<tr>
<th>board</th>
<th>posts per hour</th>
<th>posts per day</th>
<th>total</th>
</tr>
{{# graph}}
<tr>
<td>
<a href="{{prefix}}{{Board}}-0.html">{{Board}}</a>
</td>
<td>
{{Hour}}
</td>
<td>
{{Day}}
</td>
<td>
{{All}}
</td>
</tr>
{{/ graph}}
</table>
</body></html>

View File

@@ -0,0 +1,11 @@
{{!
frontpage.mustache -- template for index.html
template parameters:
- boardgraph ( a boardPageRows instance, see srnd/model.go )
- postgraph ( a postsGraph instance , see srnd/model.go )
- overview ( an overviewModel instance, see srnd/model.go )
- totalposts ( the number of total posts we have ever seen )
- frontend ( the name of the frontend )
- prefix ( the site's prefix )
}}
<!doctype html><html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>{{frontend}} on nntpchan</title></head><body><p>{{frontend}} on nntpchan</p><p><a href="ukko.html">overboard</a> <a href="{{prefix}}boards.html">boards</a> <a href="{{prefix}}static/chen-chan-faq.html">faq</a></p><dl><dt>last posts:</dt><dd>{{{overview.Render}}}</dd></dl><dl><dt>board stats:</dt><dd><table><tr><th>board</th><th>posts this hour</th><th>posts today</th><th>total</th></tr>{{# boardgraph}}<tr><td><a href="{{prefix}}{{Board}}-0.html">{{Board}}</a></td><td>{{Hour}}</td><td>{{Day}}</td><td>{{All}}</td></tr>{{/ boardgraph}}</table></dd></dl><dl><dt>total stats:</dt><dd>{{{postsgraph.Render}}}</dd></dl><p>{{totalposts}} posts total since 2015-12-23</p></body></html>

View File

@@ -0,0 +1,36 @@
{{!
graph_history.mustache
template parameters:
- history ( a list of PostEntry instances, see srnd/model.go )
}}
<html>
<head>
<meta charset="utf-8"></meta>
<link rel="stylesheet" href="{{prefix}}site.css" />
<link rel="stylesheet" href="{{prefix}}user.css" />
<title> Post History</title>
</head>
<body>
<td>
<table id="history_graph">
<thead>
<tr>
<th>Month</th>
<th>Posts</th>
<th></th>
</tr>
</thead>
<tbody>
{{#history.Scale}}
<tr>
<td>{{Date}}</td>
<td class="history_num">{{Num}}</td>
<td>{{OvercockGraph}}</td>
</tr>
{{/history.Scale}}
</tbody>
</table>
</td>
</body>
</html>

View File

@@ -0,0 +1,15 @@
{{!
keygen.mustache -- page containing a newly generated tripcode
template parameters:
- prefix ( the site prefix )
- public ( the public key in hex )
- secret ( the secret key in hex )
- tripcode ( html version of the public key )
}}
<!doctype html><html><head><title>new tripcode</title></head><body><pre>
new tripcode
secret: {{secret}}
public: {{public}}
tripcode: {{{tripcode}}}
</pre></body></html>

View File

@@ -0,0 +1,7 @@
<!doctype html><html><head><link rel="stylesheet" href="{{prefix}}static/chen-chan.css"><title>login</title></head><body>
<form action="login" method="POST" name="modlogin">
<label for="mod_key">secret</label>
<input type="password" id="mod_key" name="privkey">
<input type="submit" value="login">
</form>
</body></html>

View File

@@ -0,0 +1,9 @@
{{!
modlogin_result.mustache -- shows the result of a login attempt
template parameters:
- prefix ( the site prefix )
- mod_prefix ( the prefix to the mod panel, could be something like https://mod.site.tld/ or /mod/ )
- message ( the message returned from the login attempt )
- fail ( present if the login failed ) // not yet added
}}
<!doctype html><html><head><meta http-equiv="refresh" content="1; {{mod_prefix}}"><title>login</title></head><body><p>{{message}}</p></body></html>

View File

@@ -0,0 +1,79 @@
{{!
modpage.mustache -- the moderator panel when logged in
template parameters:
- prefix ( the site's prefix )
}}
<!doctype html><html><head>
<link rel="stylesheet" href="{{prefix}}static/chen-chan.css">
<!-- yes it uses js -->
<script src="{{prefix}}static/mod.js"></script>
<title>nntpchan mod page</title>
</head><body>
<dl>
<dt>post actions</dt>
<dd>
<div>
<label for="nntpchan_mod_target">target</label>
<input id="nntpchan_mod_target" type="text">
</div>
<div>
<button onclick="nntpchan_ban()">ban (url)</button>
<button onclick="nntpchan_delete()">delete (url)</button>
<button onclick="nntpchan_unban()">unban (ip)</button>
</div>
</dd>
</dl>
<dl>
<dt>key actions</dt>
<dd>
<div>
<label for="nntpchan_board_target">pubkey:</label>
<input type="text" id="nntpchan_key_target" />
</div>
<div>
<button onclick="nntpchan_key_add()">add key</button>
<button onclick="nntpchan_key_del()">remove key</button>
</div>
</dd>
</dl>
<dl>
<dt>board actions</dt>
<dd>
<div>
<label for="nntpchan_board_target">board name:</label>
<input type="text" id="nntpchan_board_target">
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.add')">add board</button>
<button onclick="nntpchan_admin_board('frontend.regen')">regenerate</button>
<button onclick="nntpchan_admin_board('frontend.ban')">ban</button>
<button onclick="nntpchan_admin_board('frontend.unban')">unban</button>
<button onclick="nntpchan_admin_board('frontend.nuke')">nuke</button>
</div>
</dd>
</dl>
<dl>
<dt>lightweight actions</dt>
<dd>
<button onclick="nntpchan_admin('template.reload')">reload all templates</button>
</dd>
</dl>
<dl>
<dt>very load heavy actions, use with care</dt>
<dd>
<div>
<button onclick="nntpchan_admin('frontend.regen')">regenerate all pages</button>
<button onclick="nntpchan_admin('thumbnail.regen')">regenerate all thumbnails</button>
</div>
</dd>
</dl>
<dl>
<dt>status</dt>
<dd>
<div id="nntpchan_mod_result"></div>
<noscript>
<b>enable js to use the mod panel kthx</b>
</noscript>
</dd>
</dl>
</body></html>

View File

@@ -0,0 +1,12 @@
{{!
navbar.mustache -- element on the top of each nod-mod page
TODO: make this not suck, have a board list, have board page list
template parameters:
- name ( the name of whatever resource we are on, board/thread )
- frontend ( the name of the frontend we are on )
- links ( a list of Link Models to display )
- prefix ( site prefix )
}}
<p>{{name}} on {{frontend}} | {{# links}} <a href="{{LinkURL}}">{{Text}}</a> {{/ links}} | <a href="{{prefix}}">front page</a> <a href="{{prefix}}ukko.html">overboard</a></p>

View File

@@ -0,0 +1 @@
no apparently.

View File

@@ -0,0 +1,7 @@
{{! overview.mustache
paramters:
- overview (list of PostModels in order of last posted)
}}
<table><tr><th>date</th><th>board</th><th>subject</th></tr>{{#overview}}<tr><td>{{Date}}</td><td><a href="{{Prefix}}{{Board}}-0.html">{{Board}}</a></td><td><a href="{{PostURL}}">{{Truncate.Subject}}</a></td></tr>{{/overview}}</table>

View File

@@ -0,0 +1,15 @@
<dt id="{{PostHash}}">
<a onclick="nntpchan_backlink('{{ShortHash}}');" title="{{MessageID}}">{{ShortHash}}</a>
{{Date}}
{{#IsI2P}}i2p{{/IsI2P}}{{#IsTor}}tor{{/IsTor}}{{#IsClearnet}}clr{{/IsClearnet}}
{{Subject}}
{{Name}}
{{{Pubkey}}}
<a href="{{PostURL}}">[reply]</a>
</dt>
<dd>
{{{RenderBody}}}
{{#Attachments}}
file: <a href="{{Source}}" target="_blank">{{Filename}}</a><br><br>
{{/Attachments}}
</dd>

View File

@@ -0,0 +1,3 @@
<!doctype html><html><head>
<meta http-equiv="refresh" content="1; {{redirect_url}}"></head>
<body><p>fail: {{reason}}</p></body></html>

View File

@@ -0,0 +1,40 @@
<html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>try again</title></head><body>
<form enctype="multipart/form-data" name="post" method="post">
{{#attachment}}
<input type="hidden" name="attachment_data" value="{{attachment}}">
<input type="hidden" name="attachment_filename" value="{{attachment_filename}}">
<input type="hidden" name="attachment_mime" value="{{attachment_type}}">
{{/attachment}}
<input type="hidden" name="reference" value="{{reference}}">
<input type="hidden" name="name" value="{{name}}">
<input type="hidden" name="subject" value="{{subject}}">
<input type="hidden" name="captcha_id" value="{{captcha_id}}">
<input type="hidden" name="message" value="{{message}}">
<div id="postform-outer">
<div id="postform-inner">
<div>{{fail_message}}</div>
<table class="postform">
<tbody>
<tr>
<th>
Captcha
</th>
<td>
<img id="captcha_img" src="{{prefix}}captcha/{{captcha_id}}.png" alt="captcha" />
</td>
</tr>
<tr>
<th>
Solution
</th>
<td>
<input type="text" name="captcha" />
<input type="submit" value="Post" class="button" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</body></html>

View File

@@ -0,0 +1,7 @@
{{!
post_success.mustache -- shown when we do a successful post
template parameters:
- redirect_url ( the url of the next page we should redirect to )
- message_id ( the value of the Message-ID header in the post we made, the truncated sha1 of this is the >>posthash )
}}
<!doctype html><html><head><meta http-equiv="refresh" content="2; {{redirect_url}}"></head><body><pre>posted as {{message_id}}</pre></body></html>

View File

@@ -0,0 +1,20 @@
{{!
postform.mustache -- the form for posting
template parameters:
- post_url ( the url of the post form )
- reference ( the post we are replying to, or empty string if it's an op )
- button ( the text for the reply button )
}}
<form action="{{post_url}}" enctype="multipart/form-data" name="post" method="post" style="overflow:auto">
<input type="hidden" name="reference" value="{{reference}}">
<textarea id="postform_message" name="message" placeholder="text" cols="40" rows="10" style="float:left" ></textarea><br>
<div style="float:left">
<input type="file" name="attachment"><br>
<input type="text" name="subject" placeholder="subject"><br>
<input type="text" name="name" placeholder="name"><br>
<input type="text" name="captcha" placeholder="captcha"><br>
<input type="submit" value="{{button}}" class="button"><br>
</div>
<img id="captcha_img" src="{{prefix}}captcha/img" alt="captcha" style="float:left">
</form>

View File

@@ -0,0 +1,7 @@
{{!
posts graph.mustache -- post frequence graph
parameters:
* graph - a postsGraph instance (see srnd/model.go)
}}
<table><tr><th>date</th><th>posts</th><th>cock</th></tr>{{#graph.Scale}}<tr><td>{{Day}}</td><td>{{Num}}</td><td>{{OvercockGraph}}</td></tr>{{/graph.Scale}}</table>

View File

@@ -0,0 +1,23 @@
{{!
thread.mustache -- renders to a thread-*.html page, shows the entire thread
template parameters:
- board ( the Board Model of the board this thread was posted in )
- thread ( the Thread Model of the current thread being rendered )
- form ( the post form markup )
Thread Model attributes:
- OP , the Post Model of the original poster
- Replies , a list of all the replies or empty if none
- Board , the name of the Board this thread is on
- BoardURL , the url that points to the board index page
}}
<!doctype html><html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>{{thread.OP.Subject}}</title><script src="{{thread.Prefix}}static/nntpchan.js"></script></head><body>
{{{thread.Navbar}}}
{{{form}}}
<dl>
{{{thread.OP.RenderPost}}}
{{# thread.Replies}}
{{{RenderPost}}}
{{/ thread.Replies}}
</dl>
</body></html>

View File

@@ -0,0 +1,19 @@
{{!
ukko.mustache -- overboard, contains the last threads posted regardless of newsgroup
template parameters:
- prefix ( site prefix )
- threads ( a list of Thread Models that represent the latest threads )
}}
<!doctype html><html><head><link rel="stylesheet" href="/static/chen-chan.css"><title>ukko/overboard</title></head><body>
<a href="/">frontpage</a>
{{#threads}}
<hr>
<p>posted on <a href="{{{BoardURL}}}">{{OP.Board}}</a></p>
<dl>
{{{OP.Truncate.RenderPost}}}
{{#Truncate.Replies}}
{{{Truncate.RenderPost}}}
{{/Truncate.Replies}}
</dl>
{{/threads}}
</body></html>

View File

@@ -0,0 +1,25 @@
{{!
404.mustache -- 404 page
template parameters:
- prefix (the site prefix)
}}
<html>
<head>
<title> 404 </title>
<meta charset="utf-8" />
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
</head>
<body>
<center>
<div class="not_found">
<img src="{{prefix}}static/404.png"></img>
<div class="not_found_message">
{{#i18n.Translations}}{{resource_not_found}}{{/i18n.Translations}}
</div>
</div>
</center>
</body>
</html>

View File

@@ -11,12 +11,13 @@
- Navbar ( a function that renders the navbar, should not be escaped )
- Threads ( a list of Thread Models with the last few replies )
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<link id="current_theme" rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{board.Board}}</title>
</head>
@@ -24,7 +25,12 @@
<!-- begin navbar -->
{{{board.Navbar}}}
<!-- end navbar -->
<center>
<div id="nntpchan_banner">
</div>
</center>
<div class="board_header">{{board.Board}}</div>
<div class="board_header_catalog"><a href="{{board.Prefix}}catalog-{{board.Name}}.html"> {{#i18n.Translations}}{{catalog_label}}{{/i18n.Translations}} </a></div>
<!-- postform -->
<div id="postform_container">
{{{form}}}
@@ -33,15 +39,33 @@
<div id="threads_container">
{{#board.Threads}}
<div class="thread" id="thread_{{OP.PostHash}}">
<div clsss="thread_header">
<div class="thread_header">
</div>
{{{OP.Truncate.RenderPost}}}
{{#Truncate.Replies}}
{{{Truncate.RenderPost}}}
<br />
{{/Truncate.Replies}}
<hr />
</div>
{{/board.Threads}}
</div>
<div class="pagelist">{{# board.PageList }}[<a href="{{LinkURL}}"> {{Text}} </a>] {{/ board.PageList }}
<span class="navbar-sep">
|
</span>
<a href="{{board.Prefix}}catalog-{{board.Name}}.html"> {{#i18n.Translations}}{{catalog_label}}{{/i18n.Translations}} </a>
</div>
<script type="text/javascript">
var prefix = "{{board.Prefix}}";
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, prefix);
init(prefix);
ready();
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@@ -5,25 +5,27 @@
- frontend ( the name of the frontend )
- prefix ( the site's prefix )
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css"></link>
<link rel="stylesheet" href="{{prefix}}static/user.css"></link>
<title> {{frontend}} board list </title>
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css"></link>
<title> {{frontend}} {{#i18n.Translations}}{{board_list_title}}{{/i18n.Translations}} </title>
</head>
<body>
<center>
<div class="index-outer">
<div class="index-inner">
<table id="board_graph">
<tbody>
<thead>
<tr>
<th> Board </th>
<th> Post per Hour </th>
<th> Post per Day </th>
<th> Total </th>
<th> {{#i18n.Translations}}{{board_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{pph_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{ppd_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{total}}{{/i18n.Translations}} </th>
</tr>
</thead>
<tbody>
{{# graph}}
<tr>
<td>
@@ -46,4 +48,4 @@
</div>
</center>
</body>
</html>
</html>

View File

@@ -0,0 +1,47 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<link id="current_theme" rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{catalog_title}}{{/i18n.Translations}} {{board.Name}}</title>
</head>
<body>
<!-- begin navbar -->
{{{board.Navbar}}}
<!-- end navbar -->
<center>
<div id="nntpchan_banner">
</div>
</center>
<div class="board_header">{{#i18n.Translations}}{{catalog_title}}{{/i18n.Translations}} {{board.Name}}</div>
<!-- postform -->
<hr />
<div id="catalog_container">
{{#board.Threads}}
<div class="catalog_thread">
<a class="linkThumb" href="{{OP.PostURL}}"><img src="{{OP.RepresentativeThumb}}"></a>
<div class="catalog_header">{{#i18n.Translations}}{{replies_short_label}}{{/i18n.Translations}}: {{ReplyCount}} / {{#i18n.Translations}}{{pictures_short_label}}{{/i18n.Translations}}: {{Page}}</div>
<div class="catalog_subject">{{OP.Subject}}</div>
<div class="catalog_body">
{{{OP.RenderBody}}}
</div>
</div>
{{/board.Threads}}
</div>
<script type="text/javascript">
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, "{{board.Prefix}}");
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@@ -1,9 +1,9 @@
{{!
frontpage.mustache -- template for index.html
template parameters:
- boardgraph ( a boardPageRows instance, see srnd/model.go )
- postgraph ( a postsGraph instance , see srnd/model.go )
- overview ( an overviewModel instance, see srnd/model.go )
- boardgraph ( markup of boardPageRows instance, see srnd/model.go )
- postgraph ( markup of postsGraph instance , see srnd/model.go )
- overview ( markup of overviewModel instance , see srnd/model.go )
- totalposts ( the number of total posts we have ever seen )
- frontend ( the name of the frontend )
- prefix ( the site's prefix )
@@ -12,64 +12,77 @@
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script src="{{prefix}}static/nntpchan.js" type="text/javascript"></script>
<title> {{frontend}} on nntpchan </title>
</head>
<body>
{{{navbar}}}
<center>
<div class="index-outer">
<div class="index-inner">
<h1> {{frontend}} on nntpchan </h1>
<h2>View the <a href="ukko.html">overboard</a></h2>
<h3>Read the <a href="{{prefix}}static/faq.html">FAQ</a></h3>
<h3>Join the IRC on <a href="https://qchat.rizon.net/?channels=#nntpchan">rizon</a> or <a href="irc://127.0.0.1:6668/overchan">irc2p</a></h3>
<h3>Lurk on <a href="irc://allyour4nert7pkh.onion/overchan">URC</a></h3>
<h3>Check out the <a href="{{prefix}}boards.html">board list</a></h3>
<h3>Fork on github: <a href="https://github.com/majestrate/nntpchan/">frontend</a> and <a href="https://github.com/majestrate/srndv2/">core</a></h3>
<h4>We've Had {{totalposts}} Posts Since August 01 2015 </h4>
</div>
<div class="index-inner">
<table>
<tbody>
<tr>
<td class="posts_td">
{{{postsgraph.Render}}}
</td>
<td class="board_td">
{{! todo: move boardgraph into its own file like postsgraph }}
<table id="board_graph">
<tbody>
<tr>
<th> Board </th>
<th> Posts this Hour </th>
<th> Posts Today </th>
<th> Total </th>
</tr>
{{# boardgraph}}
<div class="index-outer">
<div id="nntpchan_banner">
</div>
<div class="index-inner">
<div>{{frontend}} on nntpchan</div>
<div>View the <a href="{{prefix}}ukko.html">overboard</a></div>
<div>Join the IRC on <a href="https://qchat.rizon.net/?channels=#nntpchan">rizon</a> or <a href="irc://127.0.0.1:6668/overchan">irc2p</a></div>
<div>Check out the <a href="{{prefix}}boards.html">board list</a></div>
<div>Fork on github: <a href="https://github.com/majestrate/nntpchan/">frontend</a> and <a href="https://github.com/majestrate/srndv2/">core</a></div>
<div>We've Had {{totalposts}} Posts Since August 01 2015 </div>
</div>
<div class="index-inner">
<table>
<tbody>
<tr>
<td class="posts_td">
{{{postsgraph}}}
</td>
<td class="board_td">
{{! todo: move boardgraph into its own file like postsgraph }}
<table id="board_graph">
<thead>
<tr>
<td>
<a href="{{prefix}}{{Board}}-0.html">{{Board}}</a>
</td>
<td>
{{Hour}}
</td>
<td>
{{Day}}
</td>
<td>
{{All}}
</td>
<th> {{#i18n.Translations}}{{board_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{posts_hour}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{posts_today}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{total}}{{/i18n.Translations}} </th>
</tr>
{{/ boardgraph}}
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
{{{overview.Render}}}
</thead>
<tbody>
{{# boardgraph}}
<tr>
<td>
<a href="{{prefix}}{{Board}}-0.html">{{Board}}</a>
</td>
<td>
{{Hour}}
</td>
<td>
{{Day}}
</td>
<td>
{{All}}
</td>
</tr>
{{/ boardgraph}}
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
{{{overview}}}
</div>
</div>
</div>
</center>
<script type="text/javascript">
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, "{{prefix}}");
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@@ -4,20 +4,21 @@ template parameters:
- history ( a list of PostEntry instances, see srnd/model.go )
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8"></meta>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<title> Post History</title>
<title>{{#i18n.Translations}}{{post_history_title}}{{/i18n.Translations}}</title>
</head>
<body>
<td>
<table id="history_graph">
<thead>
<tr>
<th>Month</th>
<th>Posts</th>
<th>{{#i18n.Translations}}{{month}}{{/i18n.Translations}}</th>
<th>{{#i18n.Translations}}{{posts}}{{/i18n.Translations}}</th>
<th></th>
</tr>
</thead>

View File

@@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{api_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{api_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{api_username}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="user" value="{{dialog.User}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{api_password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="pass" value="">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{api_secret_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="secret" value="{{dialog.Secret}}">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{binary_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{binary_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{convert_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="convert" value="{{dialog.Convert}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{ffmpeg_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="ffmpeg" value="{{dialog.FFmpeg}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{sox_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="sox" value="{{dialog.Sox}}">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{cache_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{cache_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
</th>
<td>
<input type="radio" name="cache" value="file" checked> {{#i18n.Translations}}{{file_cache_name}}{{/i18n.Translations}}
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="radio" name="cache" value="null"> {{#i18n.Translations}}{{null_cache_name}}{{/i18n.Translations}}
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="radio" name="cache" value="redis"> {{#i18n.Translations}}{{redis_cache_name}}{{/i18n.Translations}}
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,56 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{crypto_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{crypto_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{key_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="key" value="{{dialog.Key}}">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,56 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
</th>
<td>
<input type="radio" name="db" value="postgres"> {{#i18n.Translations}}{{postgres_name}}{{/i18n.Translations}}
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="radio" name="db" value="redis" checked> {{#i18n.Translations}}{{redis_name}}{{/i18n.Translations}}
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,72 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{frontend_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{frontend_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{frontend_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="name" value="{{dialog.Name}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{locale_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="locale" value="{{dialog.Locale}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_files_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_files" value="1" checked>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{enable_json_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="json" value="1">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,56 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{key_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{key_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{pubkey_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="public" value="{{dialog.Public}}" size="65" readonly>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{secretkey_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="secret" value="{{dialog.Secret}}" size="65" readonly>
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,80 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{nntp_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{nntp_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{nntp_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="nntp_name" value="{{dialog.Name}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_attachments_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_attachments" value="1" checked>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_anon_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_anon" value="1" checked>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_anon_attachments_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_anon_attachments" value="1">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{require_tls_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="require_tls" value="1" checked>
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,72 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{postgres_db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{postgres_db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{port_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="port" value="{{dialog.Port}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{username_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="user" value="{{dialog.Username}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="password" value="">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{port_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="port" value="{{dialog.Port}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="password" value="">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{port_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="port" value="{{dialog.Port}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="password" value="">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@@ -5,17 +5,19 @@
- public ( the public key in hex )
- secret ( the secret key in hex )
- tripcode ( html version of the public key )
}}
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8"></meta>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<title> here is a new tripcode </title>
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{new_tripcode_title}}{{/i18n.Translations}}</title>
</head>
<body>
<pre>New Tripcode:
<div id="secret_key">secret: {{secret}}</div><div id="public_key">public: {{public}}</div><div>tripcode: <span class="tripcode" id="capcode_key">{{{tripcode}}}</span></div>
<pre>{{#i18n.Translations}}{{new_tripcode_label}}{{/i18n.Translations}}:
<div id="secret_key">{{#i18n.Translations}}{{secret_key}}{{/i18n.Translations}}: {{secret}}</div><div id="public_key">{{#i18n.Translations}}{{public_key}}{{/i18n.Translations}}: {{public}}</div><div>{{#i18n.Translations}}{{tripcode}}{{/i18n.Translations}}: <span class="tripcode" id="capcode_key">{{{tripcode}}}</span></div>
</pre>
</body>
</html>

View File

@@ -0,0 +1,32 @@
{{!
live.mustache -- live ui
template parameters:
- prefix ( site prefix )
}}
<!doctype html>
<html>
<head>
<title> {{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}} </title>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale = 1.0,maximum-scale = 1.0" />
<link rel="stylesheet" href="{{prefix}}static/livechan.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<style type="text/css" id="convo_filter">
</style>
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
</head>
<body>
<noscript>you need js for livechan mode</noscript>
<script type="text/javascript" >
var e = document.createElement("div");
e.setAttribute("id", "chat");
e.setAttribute("style", "position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;");
document.body.appendChild(e);
var board = "";
if (location.hash != "" ) {
board = location.hash.substr(1);
}
new Chat(e, board, { prefix : "{{prefix}}" });
</script>
</body>
</html>

View File

@@ -0,0 +1,49 @@
{{!
modpage.mustache -- the moderator panel when logged in
template parameters:
- prefix ( the site's prefix )
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<!-- yes it uses js -->
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<script type="text/javascript" src="{{prefix}}static/mod.js"></script>
<script type="text/javascript" src="{{prefix}}static/feed.js"></script>
<title> {{#i18n.Translations}}{{modpage_title}}{{/i18n.Translations}} </title>
</head>
<body onload="main()">
<div id="nntpchan_mod_result"></div>
<div class="nntpchan_feed_pane">
<pre> Add Feed </pre>
<label for="add_feed_host">Host</label>
<input id="add_feed_host" />
<label for="add_feed_host">Port</label>
<input id="add_feed_port" />
<label for="add_feed_name">Name</label>
<input id="add_feed_name" />
<button onclick="nntp_feed_add()">Add</button>
</div>
<div class="nntpchan_feed_pane">
<pre> Remove Feed </pre>
<label for="del_feed_name">Name</label>
<input id="del_feed_name" />
<button onclick="nntp_feed_del()">Remove</button>
</div>
<div class="nntpchan_feed_pane">
<pre> Sync Feeds </pre>
<button onclick="nntpchan_admin('feed.sync')">Sync All</button>
</div>
<div id="nntpchan_feed_result"></div>
<div id="nntpchan_feeds"></div>
<script>
nntp_feed_update();
</script>
<noscript>
<b>{{#i18n.Translations}}{{nojs_info}}{{/i18n.Translations}}</b>
</noscript>
</body>
</html>

View File

@@ -1,14 +1,16 @@
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<title>login</title>
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<title>{{#i18n.Translations}}{{login}}{{/i18n.Translations}}</title>
</head>
<body>
<form action="login" method="POST" name="modlogin">
<label for="mod_key">secret</label>
<label for="mod_key">{{#i18n.Translations}}{{secret_key}}{{/i18n.Translations}}</label>
<input type="password" id="mod_key" name="privkey" />
<input type="submit" value="login" />
<input type="submit" value="{{#i18n.Translations}}{{login}}{{/i18n.Translations}}" />
{{{csrfField}}}
</form>
</body>
</html>

View File

@@ -5,15 +5,16 @@
- mod_prefix ( the prefix to the mod panel, could be something like https://mod.site.tld/ or /mod/ )
- message ( the message returned from the login attempt )
- fail ( present if the login failed ) // not yet added
}}
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<meta http-equiv="refresh" content="1; {{mod_prefix}}"></meta>
<title>login</title>
<title>{{#i18n.Translations}}{{login}}{{/i18n.Translations}}</title>
</head>
<body>
<p>{{message}}</p>
</body>
</html>
</html>

View File

@@ -3,82 +3,107 @@
template parameters:
- prefix ( the site's prefix )
}}
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<!-- yes it uses js -->
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<script type="text/javascript" src="{{prefix}}static/mod.js"></script>
<title> nntpchan mod page </title>
<title> {{#i18n.Translations}}{{modpage_title}}{{/i18n.Translations}} </title>
</head>
<body>
<body onload="main()">
<div>
<div> post actions </div>
<div> {{#i18n.Translations}}{{post_actions_label}}{{/i18n.Translations}} </div>
<hr />
<div>
<label for="nntpchan_mod_target">target</label>
<label for="nntpchan_mod_target">{{#i18n.Translations}}{{target_label}}{{/i18n.Translations}}</label>
<input id="nntpchan_mod_target" type="text" />
</div>
<div>
<button onclick="nntpchan_ban()">ban (url)</button>
<button onclick="nntpchan_delete()">delete (url)</button>
<button onclick="nntpchan_unban()">unban (ip)</button>
<button onclick="nntpchan_ban()">{{#i18n.Translations}}{{ban_url_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_delete()">{{#i18n.Translations}}{{delete_url_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_unban()">{{#i18n.Translations}}{{unban_ip_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div> key actions </div>
<div> {{#i18n.Translations}}{{key_actions_label}}{{/i18n.Translations}} </div>
<div>
<label for="nntpchan_board_target">pubkey:</label>
<label for="nntpchan_board_target">{{#i18n.Translations}}{{pubkey_label}}{{/i18n.Translations}}:</label>
<input type="text" id="nntpchan_key_target" />
</div>
<div>
<button onclick="nntpchan_key_add()">add key</button>
<button onclick="nntpchan_key_del()">remove key</button>
<button onclick="nntpchan_key_add()">{{#i18n.Translations}}{{add_key_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_key_del()">{{#i18n.Translations}}{{remove_key_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div> board actions </div>
<div> {{#i18n.Translations}}{{nntp_login_label}}{{/i18n.Translations}} </div>
<div>
<label for="nntpchan_board_target">board name:</label>
<input type="text" id="nntpchan_board_target" />
<label for="nntpchan_nntp_username">{{#i18n.Translations}}{{username}}{{/i18n.Translations}}:</label>
<input id="nntpchan_nntp_username" />
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.add')">add board</button>
<label for="nntpchan_nntp_passwd">{{#i18n.Translations}}{{password}}{{/i18n.Translations}}:</label>
<input type="password" id="nntpchan_nntp_passwd" />
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.regen')">regenerate</button>
<button onclick="nntpchan_admin_nntp('nntp.login.add')">{{#i18n.Translations}}{{add_user_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_nntp('nntp.login.del')">{{#i18n.Translations}}{{remove_user_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div> {{#i18n.Translations}}{{board_actions_label}}{{/i18n.Translations}} </div>
<div>
<label for="nntpchan_board_target">{{#i18n.Translations}}{{board_name_title}}{{/i18n.Translations}}:</label>
<input id="nntpchan_board_target" />
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.add')">{{#i18n.Translations}}{{add_board_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.regen')">{{#i18n.Translations}}{{regenerate_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.ban')">ban</button>
<button onclick="nntpchan_admin_board('frontend.unban')">unban</button>
<button onclick="nntpchan_admin_board('frontend.ban')">{{#i18n.Translations}}{{ban_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin_board('frontend.unban')">{{#i18n.Translations}}{{unban_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.nuke')">nuke</button>
<button onclick="nntpchan_admin_board('frontend.nuke')">{{#i18n.Translations}}{{nuke_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div>
lightweight actions
{{#i18n.Translations}}{{light_actions_label}}{{/i18n.Translations}}
</div>
<div>
<button onclick="nntpchan_admin('template.reload')">reload all templates</button>
<button onclick="nntpchan_admin('template.reload')">{{#i18n.Translations}}{{reload_templates_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<label>very load heavy actions, use with care</label>
<label>{{#i18n.Translations}}{{heavy_actions_label}}{{/i18n.Translations}}</label>
<div>
<button onclick="nntpchan_admin('frontend.regen')">regenerate all pages</button>
<button onclick="nntpchan_admin('thumbnail.regen')">regenerate all thumbnails</button>
<button onclick="nntpchan_admin('frontend.regen')">{{#i18n.Translations}}{{regenerate_markup_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin('thumbnail.regen')">{{#i18n.Translations}}{{regenerate_thumbs_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin('feed.sync')">{{#i18n.Translations}}{{feed_sync_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin('store.expire')">{{#i18n.Translations}}{{expire_old_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
</div>
<div>
<a href="{{prefix}}mod/feeds">nntp feed management</a>
</div>
<div id="nntpchan_mod_result"></div>
<noscript>
<b>enable js to use the mod panel kthx</b>
<b>{{#i18n.Translations}}{{nojs_info}}{{/i18n.Translations}}</b>
</noscript>
</body>
</html>

View File

@@ -12,7 +12,7 @@
<div class="navbar">
<span class="navbar-name">
<span class="board_title">{{name}}</span>
on
{{#i18n.Translations}}{{navbar_on}}{{/i18n.Translations}}
<span class="frontend_title">{{frontend}}</span>
</span>
<span class="navbar-sep">
@@ -31,16 +31,25 @@
|
</span>
<span class="navbar-links">
<span class="navbar-link"><a href="{{prefix}}">front page</a></span>
<span class="navbar-link"><a href="{{prefix}}">{{#i18n.Translations}}{{front_page_title}}{{/i18n.Translations}}</a></span>
</span>
<span class="navbar-sep">
|
</span>
<span class="navbar-links">
<span class="navbar-link"><a href="{{prefix}}ukko.html">overboard</a></span>
<span class="navbar-link"><a href="{{prefix}}ukko.html">{{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}}</a></span>
</span>
<span class="navbar-sep">
|
</span>
<span class="navbar-links">
<span class="navbar-link"><label onclick="enable_theme('{{prefix}}','bloodgod')">bloodgod</a></span>
<span class="navbar-link"><label onclick="enable_theme('{{prefix}}','dayman')">dayman</a></span>
<span class="navbar-link"><label onclick="enable_theme('{{prefix}}','tomorrow')">tomorrow</a></span>
<span class="navbar-link"><label onclick="enable_theme('{{prefix}}','site')">yotsuba</a></span>
</span>
<span class="navbar-sep">
|
</span>
</div>
<hr />
<hr />

Some files were not shown because too many files have changed in this diff Show More