测试中,遇到任何问题请即反馈。
根据社会信用分计算发帖限制(8月22更新):
def daily_limit_posts(uid):
user = get_user_by_id_cached(uid)
trust_score = trust_score_format(user)
return min(60, max(2, int(trust_score*0.025*2)))
def daily_limit_threads(uid):
user = get_user_by_id_cached(uid)
trust_score = trust_score_format(user)
return min(8, max(1, int(trust_score*0.003*2)))
如果一个人信用分是100,那么他48小时内可以发5个回复
如果是200,48小时内可以发10个回复
声望,近期声望以及信用分的计算方式:
def update_user_pagerank_batch():
qr = QueryString('''
//let now = date_iso8601(date_now())
//let t_now = date_timestamp(now)
let t_now = date_now()
let now_iso = @now_iso
for t in users
let uid = t.uid
let time_factor = 0.99999985
filter t.t_next_pr_update < t_now - 180*1000 // update interval
sort t.t_next_pr_update asc
limit 30
//nlikes: received
//nliked: gave
let target_user = t
// all-time pagerank
let newscore = sum(
for v in votes filter v.to_uid==target_user.uid and v.vote==1
let voter = (for u in users filter u.uid==v.uid return u)[0]
let voterrank = voter.pagerank or 0
let voterbonus = (voter.uid==5108?1:0) + voterrank
let score = (voter.nliked?voterbonus / voter.nliked:0) * .95
return score
)
let last_recent_update_time = t.last_recent_update_time or '1971-01-01'
//let mrl = max([@recent_timestamp, last_recent_update_time])
let mrl = last_recent_update_time
let dtni = date_timestamp(@now_iso)
let dtlru = date_timestamp(last_recent_update_time)
let dt_since_last = (dtni - dtlru)/1000
// exp-falloff pagerank
let newscore_recent = sum(
for v in votes filter v.to_uid==target_user.uid and v.vote==1
//and v.t_c > @recent_timestamp
let voter = (for u in users filter u.uid==v.uid return u)[0]
let voterrank = voter.pagerank_recent or 0
let voterbonus = (voter.uid==5108?1:0) + voterrank
let score = (voter.recent_votes_gave?voterbonus/voter.recent_votes_gave:0)*.95
let td = (dtni - date_timestamp(v.t_cc))/1000
let coef = pow(time_factor, td)
return score * coef
)
let total_activities = (t.recent_threads or 0) + (t.recent_posts or 0)
let total_activities_w_votes = total_activities + (t.recent_votes or 0)
let total_activities_plain = (t.nthreads or 0)+(t.nposts or 0)+(t.nlikes or 0)
let tawvp = total_activities_plain*.5 + total_activities_w_votes * 2
let trust_factor = 1 - pow(0.85, tawvp)
let unit_pr = total_activities?newscore_recent / total_activities:0
let trust_score = unit_pr*trust_factor + (1-trust_factor)*(100/1000000)
// in the beginning everyone have 100 points
//----
let recent_threads = sum(
for i in threads filter i.uid==uid and i.t_c >= mrl
let coef = pow(time_factor, (dtni - date_timestamp(i.t_c))/1000)
return coef
) + (t.recent_threads or 0) * pow(time_factor, dt_since_last)
let recent_posts = sum(
for i in posts filter i.uid==uid and i.t_c >= mrl
let coef = pow(time_factor, (dtni - date_timestamp(i.t_c))/1000)
return coef
) + (t.recent_posts or 0) * pow(time_factor, dt_since_last)
let recent_votes = sum(
for i in votes filter i.to_uid==uid and i.vote==1 and i.t_cc >= mrl
let coef = pow(time_factor, (dtni - date_timestamp(i.t_cc))/1000)
return coef
) + (t.recent_votes or 0) * pow(time_factor, dt_since_last)
let recent_votes_gave = sum(
for i in votes filter i.uid==uid and i.vote==1 and i.t_cc >= mrl
let coef = pow(time_factor, (dtni - date_timestamp(i.t_cc))/1000)
return coef
) + (t.recent_votes_gave or 0) * pow(time_factor, dt_since_last)
//----
update t with {
t_next_pr_update:t_now,
pagerank:newscore,
pagerank_recent:newscore_recent,
trust_score:trust_score,
trust_factor:trust_factor,
last_recent_update_time:@now_iso,
recent_threads,
recent_posts,
recent_votes,
recent_votes_gave,
total_activities,
total_activities_w_votes,
total_activities_plain,
tawvp,
} in users
return {name:NEW.name, pr:NEW.pagerank}
''')
res = aql(qr, silent=True, raise_error=False,
# recent_timestamp=time_iso_now(-86400*365),
now_iso=time_iso_now(),
)
return len(res)