gnØland
package boards import ( "std" "strconv" ) //---------------------------------------- // Public facing functions func GetBoardIDFromName(name string) (BoardID, bool) { boardI, exists := gBoardsByName.Get(name) if !exists { return 0, false } return boardI.(*Board).id, true } func CreateBoard(name string) BoardID { std.AssertOriginCall() bid := incGetBoardID() caller := std.GetOrigCaller() if usernameOf(caller) == "" { panic("unauthorized") } url := "/r/demo/boards:" + name board := newBoard(bid, url, name, caller) bidkey := boardIDKey(bid) gBoards.Set(bidkey, board) gBoardsByName.Set(name, board) return board.id } func checkAnonFee() bool { sent := std.GetOrigSend() anonFeeCoin := std.Coin{"ugnot", int64(gDefaultAnonFee)} if len(sent) == 1 && sent[0].IsGTE(anonFeeCoin) { return true } return false } func CreateThread(bid BoardID, title string, body string) PostID { std.AssertOriginCall() caller := std.GetOrigCaller() if usernameOf(caller) == "" { if !checkAnonFee() { panic("please register, otherwise minimum fee " + strconv.Itoa(gDefaultAnonFee) + " is required if anonymous") } } board := getBoard(bid) if board == nil { panic("board not exist") } thread := board.AddThread(caller, title, body) return thread.id } func CreateReply(bid BoardID, threadid, postid PostID, body string) PostID { std.AssertOriginCall() caller := std.GetOrigCaller() if usernameOf(caller) == "" { if !checkAnonFee() { panic("please register, otherwise minimum fee " + strconv.Itoa(gDefaultAnonFee) + " is required if anonymous") } } board := getBoard(bid) if board == nil { panic("board not exist") } thread := board.GetThread(threadid) if thread == nil { panic("thread not exist") } if postid == threadid { reply := thread.AddReply(caller, body) return reply.id } else { post := thread.GetReply(postid) reply := post.AddReply(caller, body) return reply.id } } // If dstBoard is private, does not ping back. // If board specified by bid is private, panics. func CreateRepost(bid BoardID, postid PostID, title string, body string, dstBoardID BoardID) PostID { std.AssertOriginCall() caller := std.GetOrigCaller() if usernameOf(caller) == "" { // TODO: allow with gDefaultAnonFee payment. if !checkAnonFee() { panic("please register, otherwise minimum fee " + strconv.Itoa(gDefaultAnonFee) + " is required if anonymous") } } board := getBoard(bid) if board == nil { panic("src board not exist") } if board.IsPrivate() { panic("cannot repost from a private board") } dst := getBoard(dstBoardID) if dst == nil { panic("dst board not exist") } thread := board.GetThread(postid) if thread == nil { panic("thread not exist") } repost := thread.AddRepostTo(caller, title, body, dst) return repost.id } func DeletePost(bid BoardID, threadid, postid PostID, reason string) { std.AssertOriginCall() caller := std.GetOrigCaller() board := getBoard(bid) if board == nil { panic("board not exist") } thread := board.GetThread(threadid) if thread == nil { panic("thread not exist") } if postid == threadid { // delete thread if !thread.HasPermission(caller, DeletePermission) { panic("unauthorized") } board.DeleteThread(threadid) } else { // delete thread's post post := thread.GetReply(postid) if post == nil { panic("post not exist") } if !post.HasPermission(caller, DeletePermission) { panic("unauthorized") } thread.DeletePost(postid) } } func EditPost(bid BoardID, threadid, postid PostID, title, body string) { std.AssertOriginCall() caller := std.GetOrigCaller() board := getBoard(bid) if board == nil { panic("board not exist") } thread := board.GetThread(threadid) if thread == nil { panic("thread not exist") } if postid == threadid { // edit thread if !thread.HasPermission(caller, EditPermission) { panic("unauthorized") } thread.Update(title, body) } else { // edit thread's post post := thread.GetReply(postid) if post == nil { panic("post not exist") } if !post.HasPermission(caller, EditPermission) { panic("unauthorized") } post.Update(title, body) } }