You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.6 KiB
123 lines
2.6 KiB
package model |
|
|
|
import ( |
|
"net" |
|
"strconv" |
|
|
|
accmdl "go-common/app/service/main/account/model" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
const ( |
|
// StatusOK status ok |
|
StatusOK = 0 |
|
// StatusUsed status used |
|
StatusUsed = 1 |
|
// StatusExpires status expires |
|
StatusExpires = 2 |
|
) |
|
|
|
// Invite invite. |
|
type Invite struct { |
|
Status int64 `json:"status"` |
|
Mid int64 `json:"mid"` |
|
Code string `json:"invite_code"` |
|
IP uint32 `json:"-"` // legacy IP field |
|
IPng []byte `json:"-"` |
|
Ctime xtime.Time `json:"buy_time"` |
|
Expires int64 `json:"expires"` |
|
Imid int64 `json:"invited_mid,omitempty"` |
|
UsedAt int64 `json:"used_at,omitempty"` |
|
} |
|
|
|
// BuyIPString is |
|
func (inv *Invite) BuyIPString() string { |
|
if inv.IP != 0 { |
|
return inetNtoA(inv.IP) |
|
} |
|
return net.IP(inv.IPng).String() |
|
} |
|
|
|
func inetNtoA(sum uint32) string { |
|
ip := make(net.IP, net.IPv4len) |
|
ip[0] = byte((sum >> 24) & 0xFF) |
|
ip[1] = byte((sum >> 16) & 0xFF) |
|
ip[2] = byte((sum >> 8) & 0xFF) |
|
ip[3] = byte(sum & 0xFF) |
|
return ip.String() |
|
} |
|
|
|
// FillStatus fill status. |
|
func (inv *Invite) FillStatus(now int64) { |
|
if inv.Used() { |
|
inv.Status = StatusUsed |
|
return |
|
} |
|
if inv.Expired(now) { |
|
inv.Status = StatusExpires |
|
return |
|
} |
|
inv.Status = StatusOK |
|
} |
|
|
|
// Used check if used. |
|
func (inv *Invite) Used() bool { |
|
return inv.UsedAt > 0 && inv.Imid > 0 |
|
} |
|
|
|
// Expired check if expired. |
|
func (inv *Invite) Expired(now int64) bool { |
|
return now > inv.Expires |
|
} |
|
|
|
// RichInvite rich invite with invitee info. |
|
type RichInvite struct { |
|
Status int64 `json:"status"` |
|
Mid int64 `json:"mid"` |
|
Code string `json:"invite_code"` |
|
BuyIP string `json:"buy_ip"` |
|
Ctime xtime.Time `json:"buy_time"` |
|
Expires int64 `json:"expires"` |
|
Invitee *Invitee `json:"invitee,omitempty"` |
|
UsedAt int64 `json:"used_at,omitempty"` |
|
} |
|
|
|
// NewRichInvite new a rich invite. |
|
func NewRichInvite(inv *Invite, info *accmdl.Info) *RichInvite { |
|
if inv == nil { |
|
return nil |
|
} |
|
var invt *Invitee |
|
if inv.Used() { |
|
if info != nil { |
|
invt = &Invitee{ |
|
Mid: inv.Imid, |
|
Uname: info.Name, |
|
Face: info.Face, |
|
} |
|
} else { |
|
invt = &Invitee{ |
|
Mid: inv.Imid, |
|
Uname: "用户" + strconv.FormatInt(inv.Imid, 10), |
|
Face: "http://static.hdslb.com/images/member/noface.gif", |
|
} |
|
} |
|
} |
|
return &RichInvite{ |
|
Status: inv.Status, |
|
Mid: inv.Mid, |
|
Code: inv.Code, |
|
Ctime: inv.Ctime, |
|
Expires: inv.Expires, |
|
Invitee: invt, |
|
UsedAt: inv.UsedAt, |
|
BuyIP: inv.BuyIPString(), |
|
} |
|
} |
|
|
|
// Invitee invited. |
|
type Invitee struct { |
|
Mid int64 `json:"mid"` |
|
Uname string `json:"uname"` |
|
Face string `json:"face"` |
|
}
|
|
|