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.
116 lines
2.8 KiB
116 lines
2.8 KiB
package guide |
|
|
|
import ( |
|
"encoding/json" |
|
"hash/crc32" |
|
"io/ioutil" |
|
"os" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/interface/main/app-resource/conf" |
|
"go-common/app/interface/main/app-resource/model/guide" |
|
"go-common/library/log" |
|
"go-common/library/log/infoc" |
|
) |
|
|
|
var ( |
|
_emptyinterest = []*guide.Interest{} |
|
) |
|
|
|
// Service interest service. |
|
type Service struct { |
|
c *conf.Config |
|
cache []*guide.Interest |
|
interestPath string |
|
// infoc |
|
logCh chan interface{} |
|
inf2 *infoc.Infoc |
|
} |
|
|
|
// New new a interest service. |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
c: c, |
|
cache: []*guide.Interest{}, |
|
interestPath: c.InterestJSONFile, |
|
// infoc |
|
logCh: make(chan interface{}, 1024), |
|
inf2: infoc.New(c.InterestInfoc), |
|
} |
|
s.loadInterestJSON() |
|
return |
|
} |
|
|
|
// Interest buvid or time gray |
|
func (s *Service) Interest(mobiApp, buvid string, now time.Time) (res []*guide.Interest) { |
|
res = s.cache |
|
// if buvid != "" && mobiApp == "android" { |
|
// if crc32.ChecksumIEEE([]byte(reverseString(buvid)))%5 < 2 { |
|
// log.Info("interest_buvid_miss") |
|
// res = _emptyinterest |
|
// return |
|
// } |
|
// } |
|
if len(res) == 0 { |
|
log.Info("interest_null") |
|
res = _emptyinterest |
|
return |
|
} |
|
log.Info("interest_hit") |
|
return |
|
} |
|
|
|
// Interest2 is |
|
func (s *Service) Interest2(mobiApp, device, deviceid, buvid string, build int, now time.Time) (res *guide.InterestTM) { |
|
res = &guide.InterestTM{} |
|
// switch group := int(crc32.ChecksumIEEE([]byte(buvid)) % 20); group { |
|
// case 9, 18: |
|
// res = &guide.InterestTM{ |
|
// Interests: s.cache, |
|
// } |
|
// } |
|
id := crc32.ChecksumIEEE([]byte(reverseString(buvid))) % 100 |
|
if id < 5 { |
|
res.FeedType = 1 |
|
} |
|
switch mobiApp { |
|
case "iphone_b", "android_b": |
|
res.FeedType = 0 |
|
} |
|
//infoc |
|
b, _ := json.Marshal(&s.cache) |
|
s.inf2.Info(mobiApp, device, strconv.Itoa(build), buvid, deviceid, now.Format("2006-01-02 15:04:05"), strconv.Itoa(res.FeedType), string(b)) |
|
log.Info("interest_infoc_index(%s,%s,%s,%s,%s,%s,%s)_list(%s)", mobiApp, device, strconv.Itoa(build), buvid, deviceid, |
|
now.Format("2006-01-02 15:04:05"), strconv.Itoa(res.FeedType), string(b)) |
|
return |
|
} |
|
|
|
func reverseString(s string) string { |
|
runes := []rune(s) |
|
for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 { |
|
runes[from], runes[to] = runes[to], runes[from] |
|
} |
|
return string(runes) |
|
} |
|
|
|
// loadInterestJSON load interest json |
|
func (s *Service) loadInterestJSON() { |
|
file, err := os.Open(s.interestPath) |
|
if err != nil { |
|
log.Error("os.Open(%s) error(%v)", s.interestPath, err) |
|
return |
|
} |
|
defer file.Close() |
|
bs, err := ioutil.ReadAll(file) |
|
if err != nil { |
|
log.Error("ioutil.ReadAll err %v", err) |
|
return |
|
} |
|
res := []*guide.Interest{} |
|
if err = json.Unmarshal(bs, &res); err != nil { |
|
log.Error("json.Unmarshal() file(%s) error(%v)", s.interestPath, err) |
|
} |
|
s.cache = res |
|
log.Info("loadInterestJSON success") |
|
}
|
|
|