func messageHandler(msg *textsecure.Message) { var err error f := "" mt := "" if len(msg.Attachments()) > 0 { mt = msg.Attachments()[0].MimeType f, err = saveAttachment(msg.Attachments()[0]) if err != nil { log.Printf("Error saving %s\n", err.Error()) } } msgFlags := 0 text := msg.Message() if msg.Flags() == textsecure.EndSessionFlag { text = sessionReset msgFlags = msgFlagResetSession } gr := msg.Group() if gr != nil && gr.Flags != 0 { _, ok := groups[gr.Hexid] members := "" if ok { members = groups[gr.Hexid].Members } av := []byte{} if gr.Avatar != nil { av, err = ioutil.ReadAll(gr.Avatar) if err != nil { log.Println(err) return } } groups[gr.Hexid] = &GroupRecord{ GroupID: gr.Hexid, Members: strings.Join(gr.Members, ","), Name: gr.Name, Avatar: av, Active: true, } if ok { updateGroup(groups[gr.Hexid]) } else { saveGroup(groups[gr.Hexid]) } if gr.Flags == textsecure.GroupUpdateFlag { dm, _ := membersDiffAndUnion(members, strings.Join(gr.Members, ",")) text = groupUpdateMsg(dm, gr.Name) msgFlags = msgFlagGroupUpdate } if gr.Flags == textsecure.GroupLeaveFlag { text = telToName(msg.Source()) + " has left the group." msgFlags = msgFlagGroupLeave } } s := msg.Source() if gr != nil { s = gr.Hexid } session := sessionsModel.Get(s) m := session.Add(text, msg.Source(), f, mt, false) m.ReceivedAt = uint64(time.Now().UnixNano() / 1000000) m.SentAt = msg.Timestamp() m.HTime = humanizeTimestamp(m.SentAt) qml.Changed(m, &m.HTime) session.Timestamp = m.SentAt session.When = m.HTime qml.Changed(session, &session.When) if gr != nil && gr.Flags == textsecure.GroupUpdateFlag { session.Name = gr.Name qml.Changed(session, &session.Name) } if msgFlags != 0 { m.Flags = msgFlags qml.Changed(m, &m.Flags) } saveMessage(m) updateSession(session) }