func (ce *CtrlEngine) msgAdd( c *cli.Context, from, to, file string, mailInput, permanentSignature bool, attachments []string, minDelay, maxDelay int32, line *liner.State, r io.Reader, ) error { fromMapped, err := identity.Map(from) if err != nil { return err } prev, _, err := ce.msgDB.GetNym(fromMapped) if err != nil { return err } if prev == "" { return log.Errorf("user ID %s not found", from) } // TODO: handle attachments var msg []byte if file != "" { // read message from file msg, err = ioutil.ReadFile(file) if err != nil { return log.Error(err) } } else if line != nil { // read message from terminal fmt.Fprintln(ce.fileTable.StatusFP, "type message (end with Ctrl-D on empty line):") var inbuf bytes.Buffer for { ln, err := line.Prompt("") if err != nil { if err == io.EOF { break } return log.Error(err) } inbuf.WriteString(ln + "\n") } msg = inbuf.Bytes() } else { // read message from stdin msg, err = ioutil.ReadAll(r) if err != nil { return log.Error(err) } } if mailInput { recipient, message, err := mail.Parse(bytes.NewBuffer(msg)) if err != nil { return err } to = recipient msg = []byte(message) } toMapped, err := identity.Map(to) if err != nil { return err } prev, _, contactType, err := ce.msgDB.GetContact(fromMapped, toMapped) if err != nil { return err } if prev == "" || contactType == msgdb.GrayList || contactType == msgdb.BlackList { return log.Errorf("contact %s not found (for user ID %s)", to, from) } // store message in message DB now := times.Now() err = ce.msgDB.AddMessage(fromMapped, toMapped, now, true, string(msg), permanentSignature, minDelay, maxDelay) if err != nil { return err } log.Info("message added") if line != nil { fmt.Fprintln(ce.fileTable.StatusFP, "message added") } return nil }