func IncomingMail(c common.SkinnyContext, msg *enmime.MIMEBody) (err error) { text := gmail.DecodeText(msg.Text, msg.GetHeader("Content-Type")) c.Debugf("Incoming mail to %#v\n%v", msg.GetHeader("To"), text) if match := gmail.AddrReg.FindString(msg.GetHeader("To")); match != "" { lines := []string{} mailUser := strings.Split(c.SendAddress(), "@")[0] for _, line := range strings.Split(text, "\n") { if !strings.Contains(line, mailUser) && strings.Index(line, ">") != 0 { lines = append(lines, line) } } for len(lines) > 0 && strings.TrimSpace(lines[0]) == "" { lines = lines[1:] } for len(lines) > 0 && strings.TrimSpace(lines[len(lines)-1]) == "" { lines = lines[:len(lines)-1] } if len(lines) > 0 { if match2 := emailPlusReg.FindStringSubmatch(match); match2 != nil { var tag *MailTag if tag, err = DecodeMailTag(c.Secret(), match2[1]); err == nil { sender := &Member{Id: tag.R} if err = c.DB().Get(sender); err != nil { return } parent := &Message{Id: tag.M} if err = c.DB().Get(parent); err != nil { return } game := &Game{Id: parent.GameId} if err = c.DB().Get(game); err != nil { return } message := &Message{ Body: strings.TrimSpace(strings.Join(lines, "\n")), GameId: game.Id, RecipientIds: parent.RecipientIds, } c.Infof("Mail resulted in %+v from %+v", message, sender.Nation) return message.Send(c, game, sender) } } } } return nil }