package welcome import ( "bytes" "fmt" "github.com/emersion/go-message" "github.com/neilalexander/yggmail/internal/storage" "log" ) const ( WEBSITE_URL = "https://github.com/neilalexander/yggmail" CODE_URL = "https://github.com/neilalexander/yggmail" ) func Onboard(user string, storage storage.Storage, log *log.Logger) { // Fetch onboarding status if f, e := storage.ConfigGet("onboarding_done"); e == nil { // If we haven't onboarded yet if len(f) == 0 { log.Printf("Performing onboarding...\n") // takes in addr and output writer welcomeMsg, e := welcomeMessageFor(user) if e != nil { log.Println("Failure to generate welcome message") } var welcomeId int if id, e := storage.MailCreate("INBOX", welcomeMsg); e != nil { log.Printf("Failed to store welcome message: %v\n", e) panic("See above") } else { welcomeId = id } if storage.MailUpdateFlags("INBOX", welcomeId, false, false, false, false) != nil { panic("Could not set flags on onboarding message") } // set flag to never do it again if storage.ConfigSet("onboarding_done", "true") != nil { panic("Error storing onboarding flag") } log.Printf("Onboarding done\n") } else { log.Printf("Onboarding not required\n") } } else { panic("Error fetching onboarding status") } } func welcomeMessageFor(yourYggMailAddr string) ([]byte, error) { var hdr = welcomeTo(yourYggMailAddr) var buff = bytes.NewBuffer([]byte{}) // writer writes to underlying writer (our buffer) // but returns a writer just for the body part // (it will encode header to underlying writer // first) msgWrt, e := message.CreateWriter(buff, hdr) if e != nil { return nil, e } var formattedBody = fmt.Sprintf(welcomeBody, yourYggMailAddr, WEBSITE_URL, CODE_URL) if _, e := msgWrt.Write([]byte(formattedBody)); e != nil { return nil, e } // var ent, e = message.New(hdr, body_rdr) return buff.Bytes(), nil } var welcomeSubject = "Welcome to Yggmail!" var welcomeBody = ` Hey %s! We'd like to welcome you to Yggmail! You're about to embark in both a revolution and an evolution as you know it. The revolution is that this mailing system uses the new and experimental Yggdrasil internet routing system, the evolution is that it's good old email as you know it. Want to learn more? See the website Thinking of contributing; we'd be more than happy to work together. Our project is hosted on GitHub. ` func welcomeTo(yourYggMailAddr string) message.Header { // header would be a nice preview of what to expect // of the message var welcomeHdr = message.Header{} welcomeHdr.Add("From", "Yggmail Team") welcomeHdr.Add("To", yourYggMailAddr+"@yggmail") welcomeHdr.Add("Subject", welcomeSubject) // FIXME: Add content-type entry here fmt.Printf("Generated welcome mesg '%v'\n", welcomeHdr) return welcomeHdr }