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.
68 lines
2.1 KiB
68 lines
2.1 KiB
package model |
|
|
|
var ( |
|
_emptyFollowings = make([]*Following, 0) |
|
) |
|
|
|
// Black get if black. |
|
func (f *Following) Black() bool { |
|
return AttrBlack == Attr(f.Attribute) |
|
} |
|
|
|
// Friend get if both way following. |
|
func (f *Following) Friend() bool { |
|
return AttrFriend == Attr(f.Attribute) |
|
} |
|
|
|
// Following get if following. |
|
func (f *Following) Following() bool { |
|
return AttrFollowing == Attr(f.Attribute) || Attr(f.Attribute) == AttrFriend |
|
} |
|
|
|
// Whisper get if whisper. |
|
func (f *Following) Whisper() bool { |
|
return AttrWhisper == Attr(f.Attribute) |
|
} |
|
|
|
// Filter filter followings by the given attribute. |
|
func Filter(fs []*Following, attr uint32) (res []*Following) { |
|
for _, f := range fs { |
|
// NOTE: if current attribute evaluated by Attr() matched, then continue, |
|
// this includes the situation that matches black, friend, whisper, and no-relation directly. |
|
// Now we have following to deal with, since we know that the attribute friend |
|
// can either do not exist or exists with following at the same time, |
|
// to deal with this situation, we need to filter for items which have 1 on the bit that attr stands for, |
|
// and especially, the attribute it self cannot be black because the attribute black has the highest priority, |
|
// when it exists, it shadows other bits, including friend, following, whisper, no-relation, |
|
// there is no need to do further calculate, |
|
// more specifically, black when black included, the value of f.Attribute&attr may greater than 0 |
|
// when f.Attribute is 128+2 or 128+1 and the corresponding attr is 2 or 1, |
|
// which is not as we expected. |
|
if f.Attribute == 4 { |
|
f.Attribute = 6 |
|
} |
|
if (Attr(f.Attribute) == attr) || (!f.Black() && f.Attribute&attr > 0) { |
|
res = append(res, f) |
|
} |
|
} |
|
if len(res) == 0 { |
|
res = _emptyFollowings |
|
} |
|
return |
|
} |
|
|
|
// SortFollowings sort followings by the mtime desc. |
|
type SortFollowings []*Following |
|
|
|
func (fs SortFollowings) Len() int { |
|
return len(fs) |
|
} |
|
func (fs SortFollowings) Swap(i, j int) { |
|
fs[i], fs[j] = fs[j], fs[i] |
|
} |
|
func (fs SortFollowings) Less(i, j int) bool { |
|
if fs[i].MTime == fs[j].MTime { |
|
return fs[i].Mid < fs[j].Mid |
|
} |
|
return fs[i].MTime.Time().After(fs[j].MTime.Time()) |
|
}
|
|
|