diff --git a/config.go b/config.go
index bab4efe3..97b9d4e8 100644
--- a/config.go
+++ b/config.go
@@ -21,8 +21,12 @@ var staff_css = " background-color: #ffeaff;"
var uncategorised_forum_visible = true
var enable_emails = false
var site_name = "Test Install" // Should be a setting
+
var site_email = "" // Should be a setting
var smtp_server = ""
+var smtp_username = ""
+var smtp_password = ""
+
//var noavatar = "https://api.adorable.io/avatars/{width}/{id}@{site_url}.png"
var noavatar = "https://api.adorable.io/avatars/285/{id}@" + site_url + ".png"
var items_per_page = 25
diff --git a/data.sql b/data.sql
index 2fd1289a..c5a0874d 100644
--- a/data.sql
+++ b/data.sql
@@ -98,6 +98,13 @@ CREATE TABLE `replies`(
primary key(`rid`)
) CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
+CREATE TABLE `revisions`(
+ `index` int not null,
+ `content` text not null,
+ `contentID` int not null,
+ `contentType` varchar(100) DEFAULT 'replies' not null
+) CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
+
CREATE TABLE `users_replies`(
`rid` int not null AUTO_INCREMENT,
`uid` int not null,
diff --git a/forum.go b/forum.go
index c465d9fd..7561eaf6 100644
--- a/forum.go
+++ b/forum.go
@@ -1,5 +1,6 @@
package main
//import "fmt"
+import "strconv"
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
@@ -78,10 +79,24 @@ func delete_forum(fid int) error {
return nil
}
+func get_forum(fid int) (forum *Forum, res bool) {
+ if !((fid <= forumCapCount) && (fid >= 0) && forums[fid].Name!="") {
+ return forum, false
+ }
+ return &forums[fid], true
+}
+
+func get_forum_copy(fid int) (forum Forum, res bool) {
+ if !((fid <= forumCapCount) && (fid >= 0) && forums[fid].Name!="") {
+ return forum, false
+ }
+ return forums[fid], true
+}
+
func forum_exists(fid int) bool {
- //fmt.Println(fid)
- //fmt.Println(fid <= forumCapCount)
- //fmt.Println(fid >= 0)
- //fmt.Println(forums[fid].Name!="")
return (fid <= forumCapCount) && (fid >= 0) && forums[fid].Name!=""
}
+
+func build_forum_url(fid int) string {
+ return "/forum/" + strconv.Itoa(fid)
+}
diff --git a/install/install.go b/install/install.go
index 71d74ff3..ad7b2b4f 100644
--- a/install/install.go
+++ b/install/install.go
@@ -159,8 +159,12 @@ var staff_css = " background-color: #ffeaff;"
var uncategorised_forum_visible = true
var enable_emails = false
var site_name = "` + site_name + `" // Should be a setting
+
var site_email = "" // Should be a setting
var smtp_server = ""
+var smtp_username = ""
+var smtp_password = ""
+
//var noavatar = "https://api.adorable.io/avatars/{width}/{id}@{site_url}.png"
var noavatar = "https://api.adorable.io/avatars/285/{id}@" + site_url + ".png"
var items_per_page = 25
diff --git a/pages.go b/pages.go
index 6c9fc695..c5b0227f 100644
--- a/pages.go
+++ b/pages.go
@@ -103,6 +103,7 @@ var http_prot_b []byte = []byte("http://")
var invalid_url []byte = []byte("[Invalid URL]")
var invalid_topic []byte = []byte("[Invalid Topic]")
var invalid_profile []byte = []byte("[Invalid Profile]")
+var invalid_forum []byte = []byte("[Invalid Forum]")
var url_open []byte = []byte("")
var bytes_singlequote []byte = []byte("'")
@@ -156,6 +157,94 @@ func shortcode_to_unicode(msg string) string {
msg = strings.Replace(msg,":relieved:","đ",-1)
msg = strings.Replace(msg,":nerd:","đ¤",-1)
msg = strings.Replace(msg,":stuck_out_tongue:","đ",-1)
+ msg = strings.Replace(msg,":worried:","đ",-1)
+ msg = strings.Replace(msg,":drooling_face:","đ¤¤",-1)
+ msg = strings.Replace(msg,":disappointed:","đ",-1)
+ msg = strings.Replace(msg,":astonished:","đ˛",-1)
+ msg = strings.Replace(msg,":slight_frown:","đ",-1)
+ msg = strings.Replace(msg,":skull_crossbones:","â ī¸",-1)
+ msg = strings.Replace(msg,":skull:","đ",-1)
+ msg = strings.Replace(msg,":point_up:","âī¸",-1)
+ msg = strings.Replace(msg,":v:","âī¸ī¸",-1)
+ msg = strings.Replace(msg,":writing_hand:","âī¸",-1)
+ msg = strings.Replace(msg,":heart:","â¤ī¸ī¸",-1)
+ msg = strings.Replace(msg,":heart_exclamation:","âŖī¸",-1)
+ msg = strings.Replace(msg,":hotsprings:","â¨ī¸",-1)
+ msg = strings.Replace(msg,":airplane:","âī¸ī¸",-1)
+ msg = strings.Replace(msg,":hourglass:","â",-1)
+ msg = strings.Replace(msg,":watch:","â",-1)
+ msg = strings.Replace(msg,":comet:","âī¸",-1)
+ msg = strings.Replace(msg,":snowflake:","âī¸",-1)
+ msg = strings.Replace(msg,":cloud:","âī¸",-1)
+ msg = strings.Replace(msg,":sunny:","âī¸",-1)
+ msg = strings.Replace(msg,":spades:","â ī¸",-1)
+ msg = strings.Replace(msg,":hearts:","âĨī¸ī¸",-1)
+ msg = strings.Replace(msg,":diamonds:","âĻī¸",-1)
+ msg = strings.Replace(msg,":clubs:","âŖī¸",-1)
+ msg = strings.Replace(msg,":phone:","âī¸",-1)
+ msg = strings.Replace(msg,":telephone:","âī¸",-1)
+ msg = strings.Replace(msg,":biohazard:","âŖī¸",-1)
+ msg = strings.Replace(msg,":radioactive:","âĸī¸",-1)
+ msg = strings.Replace(msg,":scissors:","âī¸",-1)
+ msg = strings.Replace(msg,":arrow_upper_right:","âī¸",-1)
+ msg = strings.Replace(msg,":arrow_right:","âĄī¸",-1)
+ msg = strings.Replace(msg,":arrow_lower_right:","âī¸",-1)
+ msg = strings.Replace(msg,":arrow_lower_left:","âī¸",-1)
+ msg = strings.Replace(msg,":arrow_upper_left:","âī¸",-1)
+ msg = strings.Replace(msg,":arrow_up_down:","âī¸",-1)
+ msg = strings.Replace(msg,":left_right_arrow:","âī¸",-1)
+ msg = strings.Replace(msg,":leftwards_arrow_with_hook:","âŠī¸",-1)
+ msg = strings.Replace(msg,":arrow_right_hook:","âĒī¸",-1)
+ msg = strings.Replace(msg,":arrow_forward:","âļī¸",-1)
+ msg = strings.Replace(msg,":arrow_backward:","âī¸",-1)
+ msg = strings.Replace(msg,":female:","âī¸",-1)
+ msg = strings.Replace(msg,":male:","âī¸",-1)
+ msg = strings.Replace(msg,":ballot_box_with_check:","âī¸",-1)
+ msg = strings.Replace(msg,":heavy_check_mark:","âī¸ī¸",-1)
+ msg = strings.Replace(msg,":heavy_multiplication_x:","âī¸",-1)
+ msg = strings.Replace(msg,":pisces:","â",-1)
+ msg = strings.Replace(msg,":aquarius:","â",-1)
+ msg = strings.Replace(msg,":capricorn:","â",-1)
+ msg = strings.Replace(msg,":sagittarius:","â",-1)
+ msg = strings.Replace(msg,":scorpius:","â",-1)
+ msg = strings.Replace(msg,":libra:","â",-1)
+ msg = strings.Replace(msg,":virgo:","â",-1)
+ msg = strings.Replace(msg,":leo:","â",-1)
+ msg = strings.Replace(msg,":cancer:","â",-1)
+ msg = strings.Replace(msg,":gemini:","â",-1)
+ msg = strings.Replace(msg,":taurus:","â",-1)
+ msg = strings.Replace(msg,":aries:","â",-1)
+ msg = strings.Replace(msg,":peace:","âŽī¸",-1)
+ msg = strings.Replace(msg,":eight_spoked_asterisk:","âŗī¸",-1)
+ msg = strings.Replace(msg,":eight_pointed_black_star:","â´ī¸",-1)
+ msg = strings.Replace(msg,":snowman2:","âī¸",-1)
+ msg = strings.Replace(msg,":umbrella2:","âī¸",-1)
+ msg = strings.Replace(msg,":pencil2:","âī¸",-1)
+ msg = strings.Replace(msg,":black_nib:","âī¸",-1)
+ msg = strings.Replace(msg,":email:","âī¸",-1)
+ msg = strings.Replace(msg,":envelope:","âī¸",-1)
+ msg = strings.Replace(msg,":keyboard:","â¨ī¸",-1)
+ msg = strings.Replace(msg,":white_small_square:","âĢī¸",-1)
+ msg = strings.Replace(msg,":black_small_square:","âĒī¸",-1)
+ msg = strings.Replace(msg,":secret:","ãī¸",-1)
+ msg = strings.Replace(msg,":congratulations:","ãī¸",-1)
+ msg = strings.Replace(msg,":m:","âī¸",-1)
+ msg = strings.Replace(msg,":tm:","âĸī¸ī¸",-1)
+ msg = strings.Replace(msg,":registered:","ÂŽī¸",-1)
+ msg = strings.Replace(msg,":copyright:","Šī¸",-1)
+ msg = strings.Replace(msg,":wavy_dash:","ã°ī¸",-1)
+ msg = strings.Replace(msg,":bangbang:","âŧī¸",-1)
+ msg = strings.Replace(msg,":sparkle:","âī¸",-1)
+ msg = strings.Replace(msg,":star_of_david:","âĄī¸",-1)
+ msg = strings.Replace(msg,":wheel_of_dharma:","â¸ī¸",-1)
+ msg = strings.Replace(msg,":yin_yang:","â¯ī¸",-1)
+ msg = strings.Replace(msg,":cross:","âī¸",-1)
+ msg = strings.Replace(msg,":orthodox_cross:","âĻī¸",-1)
+ msg = strings.Replace(msg,":star_and_crescent:","âĒī¸",-1)
+ msg = strings.Replace(msg,":frowning2:","âšī¸",-1)
+ msg = strings.Replace(msg,":information_source:","âšī¸",-1)
+ msg = strings.Replace(msg,":interrobang:","âī¸",-1)
+
return msg
}
@@ -167,24 +256,20 @@ func preparse_message(msg string) string {
return shortcode_to_unicode(msg)
}
-//var msg_index int = 0
func parse_message(msg string/*, user User*/) string {
msg = strings.Replace(msg,":)","đ",-1)
+ msg = strings.Replace(msg,":(","đ",-1)
msg = strings.Replace(msg,":D","đ",-1)
msg = strings.Replace(msg,":P","đ",-1)
+ msg = strings.Replace(msg,":O","đ˛",-1)
+ msg = strings.Replace(msg,":p","đ",-1)
+ msg = strings.Replace(msg,":o","đ˛",-1)
//msg = url_reg.ReplaceAllString(msg,"$2$3//$4")
// Search for URLs, mentions and hashlinks in the messages...
//fmt.Println("Parser Loop!")
- //fmt.Println("Message Index:")
- //msg_index++
- //fmt.Println(msg_index)
var msgbytes = []byte(msg)
var outbytes []byte
- //fmt.Println("Outbytes Start:")
- //fmt.Println(outbytes)
- //fmt.Println(string(outbytes))
- //fmt.Println("Outbytes Start End:")
msgbytes = append(msgbytes,space_gap...)
//fmt.Println(`"`+string(msgbytes)+`"`)
lastItem := 0
@@ -205,7 +290,6 @@ func parse_message(msg string/*, user User*/) string {
if (i==0 && (msgbytes[0] > 32)) || ((msgbytes[i] < 33) && (msgbytes[i + 1] > 32)) {
//fmt.Println("IN")
//fmt.Println(msgbytes[i])
- //fmt.Println("STEP CONTINUE")
if (i != 0) || msgbytes[i] < 33 {
i++
}
@@ -263,8 +347,29 @@ func parse_message(msg string/*, user User*/) string {
outbytes = append(outbytes, rid_bit...)
outbytes = append(outbytes, url_close...)
lastItem = i
+ } else if bytes.Equal(msgbytes[i+1:i+5],[]byte("fid-")) {
+ outbytes = append(outbytes,msgbytes[lastItem:i]...)
+ i += 5
+ start := i
+ fid, int_len := coerce_int_bytes(msgbytes[start:])
+ i += int_len
+
+ if !forum_exists(fid) {
+ outbytes = append(outbytes,invalid_forum...)
+ lastItem = i
+ continue
+ }
+
+ outbytes = append(outbytes, url_open...)
+ var url_bit []byte = []byte(build_forum_url(fid))
+ outbytes = append(outbytes, url_bit...)
+ outbytes = append(outbytes, url_open2...)
+ var fid_bit []byte = []byte("#fid-" + strconv.Itoa(fid))
+ outbytes = append(outbytes, fid_bit...)
+ outbytes = append(outbytes, url_close...)
+ lastItem = i
} else {
- // TO-DO: Forum Link
+ // TO-DO: Forum Shortcode Link
}
} else if msgbytes[i]=='@' {
//fmt.Println("IN @")
diff --git a/routes.go b/routes.go
index f2468be4..b52fc779 100644
--- a/routes.go
+++ b/routes.go
@@ -724,6 +724,16 @@ func route_create_reply(w http.ResponseWriter, r *http.Request) {
return
}
+ // Reload the topic...
+ err = topics.Load(tid)
+ if err != nil && err != sql.ErrNoRows {
+ LocalError("The destination no longer exists",w,r,user)
+ return
+ } else if err != nil {
+ InternalError(err,w,r)
+ return
+ }
+
http.Redirect(w,r,"/topic/" + strconv.Itoa(tid), http.StatusSeeOther)
err = increase_post_user_stats(wcount, user.ID, false, user)
if err != nil {
diff --git a/utils.go b/utils.go
index f7668b14..13d65fa2 100644
--- a/utils.go
+++ b/utils.go
@@ -87,6 +87,14 @@ func SendEmail(email string, subject string, msg string) bool {
return false
}
+ if smtp_username != "" {
+ auth := smtp.PlainAuth("",smtp_username,smtp_password,smtp_server)
+ err = con.Auth(auth)
+ if err != nil {
+ return false
+ }
+ }
+
email_data, err := con.Data()
if err != nil {
return false