1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-20 09:26:23 -07:00

display recent posts on front page, fix posts on thread page

This commit is contained in:
Joshua Merrell 2014-06-15 02:15:51 -07:00
parent b56683abe5
commit edf9485be8
12 changed files with 186 additions and 123 deletions

View file

@ -1,2 +1,3 @@
#!/bin/bash
go build -v -o gochan ./src
export GOPATH=$PWD/lib
go build -v -o gochan ./src

View file

@ -1,3 +1,14 @@
* {
-ms-word-break: break-all;
word-break: break-all;
word-break: break-word;
-webkit-hyphens: auto;
-moz-hyphens: auto;
hyphens: auto;
}
#footer {
clear:both;
display: block;

View file

@ -1,88 +1,86 @@
#current-tab,#topbar li:hover {
background-color:#404040;
}
/* imported by individual sass pre-compiled css files */
* {
outline: none; }
#footer {
font-size:12px;
}
#site-title {
color:#e1b400;
}
font-size: 12px; }
#topbar {
background-color:#202020;
box-shadow:0px 2px 2px 3px #101010;
height:26px;
}
background-color: #202020;
box-shadow: 2px 2px 2px 3px #101010;
height: 26px; }
#topbar li:hover {
background-color: #404040; }
#footer {
font-size: 12px; }
#site-title {
color: #e1b400; }
#topbar {
background-color: #202020;
box-shadow: 2px 2px 2px 3px #101010;
height: 26px; }
.topbar-item:hover {
background-color: #404040;
}
background-color: #404040; }
.dropdown-button:hover{
background-color: #404040;
}
.dropdown-button:hover {
background-color: #404040; }
.dropdown-menu {
background-color:#202020;
box-shadow:0 6px 2px 2px #101010;
}
.menu {
margin-top:1em;
text-align:center;
}
.section-body {
background-color:#606060;
}
.section-title-block {
box-shadow: 2px 2px 3px 4px #101010;
background-color:#202020;
border-radius:8px;
}
.tab {
background-color:#202020;
border:1px solid #424242;
text-align:center;
}
background-color: #202020;
box-shadow: 2px 2px 2px 3px #101010; }
a {
background:inherit;
color:#f90;
font-family:sans-serif;
text-decoration:none;
}
background: inherit;
color: #f90;
font-family: sans-serif;
text-decoration: none; }
a.permalink {
background:inherit;
color:#f90;
}
background: inherit;
color: #f90; }
a.permalink:hover {
background:inherit;
color:#ffd43f;
}
background: inherit;
color: #ffd43f; }
a:hover {
background:inherit;
color:#ffd43f;
font-family:sans-serif;
}
background: inherit;
color: #ffd43f;
font-family: sans-serif; }
body {
background:#EEF2FF;
background-attachment:fixed;
background-image:url(images/pipes_bg.png);
color:#d8d0b9;
font-family:sans-serif;
font-size:12pt;
}
background-image: url(images/pipes_bg.png);
color: #d8d0b9;
font-family: sans-serif;
font-size: 12pt; }
ul.staffmenu li:hover {
background:#404040;
}
background: #404040; }
#site-title {
color: #e1b400; }
.section-body {
background-color: #606060; }
.section-title-block {
background-color: #202020;
border-radius: 8px 8px 0px 0px; }
.tab {
background-color: #404040;
border: 1px solid #202020;
text-align: center; }
#current-tab {
background-color: #202020; }
div#recent-posts-header {
box-shadow: 0px 2px 2px 3px #101010;
border-radius: 8px 8px 8px 8px;
margin-bottom: 8px; }

View file

@ -8,6 +8,6 @@
<!--<img src="/error.png" border="0" alt=""> -->
<p>The requested file could not be found on this server. Are you just typing random stuff in the address bar? If you followed a link from this site here, then post <a href="/site">here</a></p>
<audio src="http://dl.dropbox.com/u/10266670/forever.wav" autoplay="autoplay"></audio>
<hr><address>http://lunachan.net powered by Gochan v0.4</address>
<hr><address>http://lunachan.net powered by Gochan v0.7</address>
</body>
</html>

View file

@ -7,6 +7,6 @@
<h1>500: Internal Server error</h1>
<marquee><img src="/error/derpy server.gif" border="0" alt=""></marquee>
<p>Someone let Derpy into the server room again...sorry about that. Please try reloading the page. If that doesn't fix the problem, you can email me <a href="mailto:admin@lunachan.net">here</a>, noting the time and the page you tried to access.
<hr><address>http://lunachan.net powered by Gochan v0.4</address>
<hr><address>http://lunachan.net powered by Gochan v0.7</address>
</body>
</html>

View file

@ -6,6 +6,6 @@
<body>
<h1>500: Internal Server error</h1>
<p>The server encountered an error while trying to serve the page. We apologize for the inconvenience.</p>
<hr><address>http://lunachan.net powered by Gochan v0.4</address>
<hr><address>http://lunachan.net powered by Gochan v0.7</address>
</body>
</html>

View file

@ -810,6 +810,7 @@ var manage_functions = map[string]ManageFunction{
var section_arr []interface{}
var board_arr []interface{}
var front_arr []interface{}
var recent_posts_arr []interface{}
os.Remove(path.Join(config.DocumentRoot,"index.html"))
front_file,err := os.OpenFile(path.Join(config.DocumentRoot,"index.html"),os.O_CREATE|os.O_RDWR,0777)
@ -875,15 +876,48 @@ var manage_functions = map[string]ManageFunction{
front_arr = append(front_arr,frontpage)
}
// get recent posts
rows,err = db.Query("SELECT `" + config.DBprefix + "posts`.`id`, " +
"`" + config.DBprefix + "posts`.`parentid`, " +
"`" + config.DBprefix +"boards`.`dir` AS boardname, " +
"`" + config.DBprefix + "posts`.`boardid` AS boardid, " +
"`name`, " +
"`tripcode`, " +
"`message`," +
"`filename`, " +
"`thumb_w`, " +
"`thumb_h` " +
" FROM `" + config.DBprefix + "posts`, " +
"`" + config.DBprefix + "boards` " +
"WHERE `" + config.DBprefix + "posts`.`deleted_timestamp` = \"" + nil_timestamp + "\"" +
"ORDER BY `timestamp` DESC " +
"LIMIT " + strconv.Itoa(config.MaxRecentPosts))
if err != nil {
error_log.Print(err.Error())
return err.Error()
}
for rows.Next() {
recent_posts := new(RecentPost)
err = rows.Scan(&recent_posts.PostID, &recent_posts.ParentID, &recent_posts.BoardName, &recent_posts.BoardID, &recent_posts.Name, &recent_posts.Tripcode, &recent_posts.Message, &recent_posts.Filename, &recent_posts.ThumbW, &recent_posts.ThumbH)
if err != nil {
error_log.Print(err.Error())
return err.Error()
}
recent_posts_arr = append(recent_posts_arr, recent_posts)
}
page_data := &Wrapper{IName:"fronts", Data: front_arr}
board_data := &Wrapper{IName:"boards", Data: board_arr}
section_data := &Wrapper{IName:"sections", Data: section_arr}
recent_posts_data := &Wrapper{IName:"recent posts", Data: recent_posts_arr}
var interfaces []interface{}
interfaces = append(interfaces, config)
interfaces = append(interfaces, page_data)
interfaces = append(interfaces, board_data)
interfaces = append(interfaces, section_data)
interfaces = append(interfaces, recent_posts_data)
wrapped := &Wrapper{IName: "frontpage",Data: interfaces}
err = front_page_tmpl.Execute(front_file,wrapped)
@ -968,7 +1002,22 @@ var manage_functions = map[string]ManageFunction{
limit = "50"
}
html = "<h1>Recent posts</h1>\nLimit by: <select id=\"limit\"><option>25</option><option>50</option><option>100</option><option>200</option></select>\n<br />\n<table width=\"100%%d\" border=\"1\">\n<colgroup><col width=\"25%%\" /><col width=\"50%%\" /><col width=\"17%%\" /></colgroup><tr><th></th><th>Message</th><th>Time</th></tr>"
rows,err := db.Query("SELECT HIGH_PRIORITY `" + config.DBprefix + "boards`.`dir` AS `boardname`, `" + config.DBprefix + "posts`.`boardid` AS boardid, `" + config.DBprefix + "posts`.`id` AS id, `" + config.DBprefix + "posts`.`parentid` AS parentid, `" + config.DBprefix + "posts`.`message` AS message, `" + config.DBprefix + "posts`.`ip` AS ip, `" + config.DBprefix + "posts`.`timestamp` AS timestamp FROM `" + config.DBprefix + "posts`, `" + config.DBprefix + "boards` WHERE `reviewed` = 0 AND `" + config.DBprefix + "posts`.`deleted_timestamp` = \""+nil_timestamp+"\" AND `boardid` = `"+config.DBprefix+"boards`.`id` ORDER BY `timestamp` DESC LIMIT "+limit+";")
rows,err := db.Query("SELECT HIGH_PRIORITY `" + config.DBprefix + "boards`.`dir` AS `boardname`, " +
"`" + config.DBprefix + "posts`.`boardid` AS boardid, " +
"`" + config.DBprefix + "posts`.`id` AS id, " +
"`" + config.DBprefix + "posts`. " +
"`parentid` AS parentid, " +
"`" + config.DBprefix + "posts`. " +
"`message` AS message, " +
"`" + config.DBprefix + "posts`. " +
"`ip` AS ip, " +
"`" + config.DBprefix + "posts`. " +
"`timestamp` AS timestamp " +
"FROM `" + config.DBprefix + "posts`, `" + config.DBprefix + "boards` " +
"WHERE `reviewed` = 0 " +
"AND `" + config.DBprefix + "posts`.`deleted_timestamp` = \""+nil_timestamp+"\" " +
"AND `boardid` = `"+config.DBprefix+"boards`.`id` " +
"ORDER BY `timestamp` DESC LIMIT "+limit+";")
if err != nil {
html += "<tr><td>"+err.Error()+"</td></tr></table>"
return

View file

@ -174,6 +174,7 @@ func validReferrer(request http.Request) (valid bool) {
}
func utilHandler(writer http.ResponseWriter, request *http.Request, data interface{}) {
writer.Header().Add("Content-Type", "text/css")
action := request.FormValue("action")
board := request.FormValue("board")
var err error

View file

@ -7,6 +7,7 @@ import (
"net/http"
"os"
"path"
"strconv"
"strings"
"text/template"
"time"
@ -40,11 +41,8 @@ var funcMap = template.FuncMap{
}()
return slice
},
"gt": func(a int, b int) bool {
return a > b
},
"lt": func(a int, b int) bool {
return a < b
"stringAppend": func(a, b string) string {
return a + b
},
"stringEq": func(a, b string) bool {
return a == b
@ -52,9 +50,19 @@ var funcMap = template.FuncMap{
"stringNeq": func(a, b string) bool {
return a != b
},
"truncateMessage": func(a string, b int) string {
if len(a) < b {
return a
} else {
return a[:b] + "..."
}
},
"intEq": func(a, b int) bool {
return a == b
},
"intToString": func(a int) string {
return strconv.Itoa(a)
},
"isStyleDefault_img": func(style string) bool {
return style == config.DefaultStyle_img
},
@ -83,11 +91,17 @@ var funcMap = template.FuncMap{
return
},
"getThumbnailFilename": func(name string) string {
filetype := name[len(name)-4:]
if filetype == ".gif" || filetype == ".GIF" {
return name[0:len(name)-3]+"jpg"
if name == "" {
return ""
}
return name
fmt.Println(name[len(name) - 3:])
if name[len(name) - 3:] == "gif" || name[len(name) - 3:] == "gif" {
name = name[:len(name) - 3] + "jpg"
}
ext_begin := strings.LastIndex(name, ".")
new_name := name[:ext_begin] + "t." + getFiletype(name)
fmt.Println(new_name)
return new_name
},
"formatFilesize": func(size_int int) string {
size := float32(size_int)
@ -110,11 +124,6 @@ var funcMap = template.FuncMap{
index := strings.LastIndex(img, ".")
return img[0:index]+"t."+filetype
},
"printValue": func(i interface{}) int {
fmt.Println("interface: ", i.(string))
fmt.Println("value: ", i)
return 0
},
}
var (
@ -186,7 +195,7 @@ func initTemplates() {
img_boardpage_tmpl_bytes,_ := ioutil.ReadFile(path.Join(config.TemplateDir,"img_boardpage.html"))
if tmpl_err != nil {
fmt.Println("Failed loading template \"" + config.TemplateDir+"/img_boardpage.html\": " + tmpl_err.Error())
fmt.Println("Failed loading template \"" + config.TemplateDir + "/img_boardpage.html\": " + tmpl_err.Error())
os.Exit(2)
}
img_boardpage_tmpl_str = "{{$config := getInterface .Data 0}}" +
@ -241,6 +250,7 @@ func initTemplates() {
"{{$page_arr := getInterface .Data 1}}" +
"{{$board_arr := getInterface .Data 2}}" +
"{{$section_arr := getInterface .Data 3}}" +
"{{$recent_posts_arr := getInterface .Data 4}}" +
string(front_page_tmpl_bytes)
front_page_tmpl,tmpl_err = template.New("front_page_tmpl").Funcs(funcMap).Parse(front_page_tmpl_str)
if tmpl_err != nil {

View file

@ -26,7 +26,12 @@ type RecentPost struct {
BoardID int
PostID int
ParentID int
Name string
Tripcode string
Message string
Filename string
ThumbW int
ThumbH int
IP string
Timestamp time.Time
}

View file

@ -30,7 +30,7 @@
<div id="main">
<div id="tab-bar">
<div id="current-tab" class="tab">
<a href="#">Home</a>
<a href="#">News</a>
</div>
<div class="tab">
<a href="#boards">Boards</a>
@ -105,38 +105,24 @@
{{end}}
{{end}}
</div>
<div id="recent-posts">
<div class="section-title-box"><b>Recent Posts</b></div>
<div class="section-block">
<div class="section-title-block">
<span class="section-title"><a href="/test/">/test/</a></span> - <b>Poster Mc</b>!Tripcode
</div>
<div class="section-body">
<img src="135693079632s.png" alt="test img"/>
TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT...<br /><i>(Post truncated, click <a href="/test/">here</a> to continue reading)</i>
</div>
</div>
{{if gt $config.MaxRecentPosts 0}}
<div id="recent-posts">
<div id="recent-posts-header" class="section-title-block"><b>Recent Posts</b></div>
{{range $i, $post := $recent_posts_arr.Data}}
<div class="section-block">
<div class="section-title-block">
<span class="section-title"><a href="{{$post.BoardName}}/res/{{if intEq $post.ParentID 0}}{{intToString $post.PostID}}.html{{else}}{{intToString $post.ParentID}}.html#{{intToString $post.PostID}}{{end}}">/{{$post.BoardName}}/</a></span> - {{$appended := stringAppend $post.Name $post.Tripcode}}{{if stringEq $appended ""}}<b>Anonymous</b>{{else}}<b>{{$post.Name}}</b>{{if stringNeq $post.Tripcode ""}}!{{$post.Tripcode}}{{end}}{{end}}
</div>
<div class="section-body">
{{if stringNeq $post.Filename ""}}<img src="{{$post.BoardName}}/thumb/{{getThumbnailFilename $post.Filename}}" alt="post thumbnail"/>{{end}}
{{truncateMessage $post.Message 225}}
<div class="section-block">
<div class="section-title-block">
<span class="section-title"><a href="/test/">/test/</a></span> - <b>Anonymous</b>
</div>
<div class="section-body">
OP is a pony.
</div>
</div>
{{end}}
</div>
<div class="section-block">
<div class="section-title-block">
<span class="section-title"><a href="/test/">/test/</a></span> - <b>Poster Mc</b>!Tripcode
</div>
<div class="section-body">
<img src="135683008384s.png" alt="test img"/>
<a href="#">&gt;&gt;22222</a><br />
HERP DERP FROSTED BUTTS
</div>
</div>
</div>
{{end}}
</div>
<div id="footer">
<a href="{{$config.SiteWebfolder}}">Home</a> | <a href="{{$config.SiteWebfolder}}#boards">Boards</a> | <a href="{{$config.SiteWebfolder}}#rules">Rules</a> | <a href="{{$config.SiteWebfolder}}#faq">FAQ</a><br />

View file

@ -73,13 +73,15 @@
</div>
</div>
{{range $reply_num,$reply := $post_arr}}{{if gt $reply_num 0}}
<div class="reply" id="{{$reply.ID}}">
<input type="checkbox" id="check{{$reply.ID}}" name="check{{$reply.ID}}" /> <label class="post-info" for="check{{$reply.ID}}"><span class="postername">{{if stringNeq $reply.Email ""}}<a href="mailto:{{$reply.Email}}">{{end}}{{if stringNeq $reply.Name ""}}{{$reply.Name}}{{else}}{{if stringEq $reply.Tripcode ""}}{{$board.Anonymous}}{{end}}{{end}}{{if stringNeq $reply.Email ""}}</a>{{end}}</span>{{if stringNeq $reply.Tripcode ""}}<span class="tripcode">!{{$reply.Tripcode}}</span>{{end}} {{formatTimestamp $reply.Timestamp}} </label><a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}">No.</a> <a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}i">{{$reply.ID}}</a> <span class="post-links"><span class="thread-ddown">[<a href="javascript:void(0)">&#9660;</a>]</span></span><br />
{{if stringNeq $reply.Filename ""}}<span class="file-info">File: <a href="../src/{{$reply.Filename}}" target="_blank">{{$reply.Filename}}</a> - ({{formatFilesize $reply.Filesize}} , {{$reply.ImageW}}x{{$reply.ImageH}}, {{$reply.FilenameOriginal}} )</span><br />
<a href="{{$config.SiteWebfolder}}{{$board.Dir}}/src/{{$reply.Filename}}"><img src="{{$config.SiteWebfolder}}{{$board.Dir}}/thumb/{{imageToThumbnailPath $reply.Filename}}" width="{{$reply.ThumbW}}" height="{{$reply.ThumbH}}" class="thumbnail" alt="{{imageToThumbnailPath $reply.Filename}}" /></a>{{end}}
<div class="reply-container" id="{{$reply.ID}}">
<div class="reply" id="{{$reply.ID}}">
<input type="checkbox" id="check{{$reply.ID}}" name="check{{$reply.ID}}" /> <label class="post-info" for="check{{$reply.ID}}"><span class="postername">{{if stringNeq $reply.Email ""}}<a href="mailto:{{$reply.Email}}">{{end}}{{if stringNeq $reply.Name ""}}{{$reply.Name}}{{else}}{{if stringEq $reply.Tripcode ""}}{{$board.Anonymous}}{{end}}{{end}}{{if stringNeq $reply.Email ""}}</a>{{end}}</span>{{if stringNeq $reply.Tripcode ""}}<span class="tripcode">!{{$reply.Tripcode}}</span>{{end}} {{formatTimestamp $reply.Timestamp}} </label><a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}">No.</a> <a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}i">{{$reply.ID}}</a> <span class="post-links"><span class="thread-ddown">[<a href="javascript:void(0)">&#9660;</a>]</span></span><br />
{{if stringNeq $reply.Filename ""}}<span class="file-info">File: <a href="../src/{{$reply.Filename}}" target="_blank">{{$reply.Filename}}</a> - ({{formatFilesize $reply.Filesize}} , {{$reply.ImageW}}x{{$reply.ImageH}}, {{$reply.FilenameOriginal}} )</span><br />
<a href="{{$config.SiteWebfolder}}{{$board.Dir}}/src/{{$reply.Filename}}"><img src="{{$config.SiteWebfolder}}{{$board.Dir}}/thumb/{{imageToThumbnailPath $reply.Filename}}" width="{{$reply.ThumbW}}" height="{{$reply.ThumbH}}" class="thumbnail" alt="{{imageToThumbnailPath $reply.Filename}}" /></a>{{end}}
<div class="post-text">
{{$reply.Message}}
<div class="post-text">
{{$reply.Message}}
</div>
</div>
</div>