func (a *API) FindMsgAttachedTo(args *rpc.Args, r *rpc.Ret) (err os.Error) { attachTo, err := args.QueryString("AttachTo") if err != nil || attachTo == "" { return ErrArg } joins, err := a.db.FindMsgAttachedTo(attachTo) if err != nil { return err } q := make([]msgJoinJSON, len(joins)) for i, join := range joins { author, err := a.whoIsID(join.Author) if err != nil { log.Printf("Unresolved author ID: %s", join.Author) q[i].AuthorNym = "anonymous" } else { q[i].AuthorNym = author.Login } q[i].ID = WebStringOfObjectID(join.ID) q[i].Body = join.Doc.Body q[i].AuthorID = WebStringOfObjectID(join.Author) q[i].AttachTo = WebStringOfObjectID(join.AttachTo) q[i].ReplyTo = WebStringOfObjectID(join.ReplyTo) modtm := time.NanosecondsToLocalTime(int64(join.Modified)).Format(msgFormat) q[i].Modified = modtm } r.SetInterface("Results", q) return nil }
// AddMsg adds a new message to the database. The author is the currently // logged in user. The message is attached to the object given by the string // argument "AttachTo". Optionally, the message is in response to another message // with message ID "ReplyTo". AddMsg returns the message ID of the newly added // message, in the return field "ID". func (a *API) AddMsg(args *rpc.Args, r *rpc.Ret) (err os.Error) { authorDoc, authorID, err := a.whoAmI(args) if err != nil { return err } attachTo, err := args.QueryString("AttachTo") if err != nil || attachTo == "" { return ErrArg } replyTo, _ := args.QueryString("ReplyTo") body, err := args.QueryString("Body") if err != nil || body == "" { return ErrArg } msgID, err := a.db.AddMsg(authorID, attachTo, ObjectIDOfWebString(replyTo), body) if err != nil { return err } j := msgJoinJSON{ ID: WebStringOfObjectID(msgID), Body: body, AuthorID: WebStringOfObjectID(authorID), AuthorNym: authorDoc.Login, AttachTo: attachTo, ReplyTo: replyTo, Modified: time.NanosecondsToLocalTime(int64(bson.Now())).Format(msgFormat), } r.SetInterface("Msg", j) return nil }
// converts the *os.FileInfo to FileData func fileInfoToNode(file *os.FileInfo) FileData { t := time.NanosecondsToLocalTime(file.Mtime_ns) timeStr := t.Format("Jan _2 15:04") permissions := "" permo := fmt.Sprintf("%o", file.Mode) rwx := permo[len(permo)-3 : len(permo)] if permo[0] == '4' { permissions += "d" } else { permissions += "-" } for _, char := range rwx { switch char { case '0': permissions += "---" case '1': permissions += "--x" case '2': permissions += "-w-" case '3': permissions += "-wx" case '4': permissions += "r--" case '5': permissions += "r-x" case '6': permissions += "rw-" case '7': permissions += "rwx" } } n := FileData{permissions, file.Nlink, file.Uid, file.Gid, file.Size, timeStr, file.Name, file.Blocks} return n }