using Elasticsearch.Net;
using JiaZhiQuan.Common.ElasticSearch;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Senparc.Weixin.MP.Containers;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Dynamic;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Wicture.DbRESTFul;
using Wicture.DbRESTFul.Cache;
using Wicture.DbRESTFul.Infrastructure.Repository;
namespace JiaZhiQuan.Common
{
public static partial class RepositoryExtension
{
///
/// 获取用户的通知配置
///
public static async Task GetUserMessagePushConfig(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long userId, IDbConnection conn = null)
{
var key = CacheKeys.PushMsgUserConfig(userId);
UserMessagePushConfig config;
if (!(await cacheProvider.KeyExist(key)))
{
// 如果未找到此用户的配置,则从数据库获取
config = await repository.QuerySingleOrDefaultAsync("select `all`, thumbsup, newfan, `comment`, `at`, focusPost, sys, recommend, followTopic from n_user_msgpush_setting where userId=" + userId + " limit 1", null, conn);
await cacheProvider.Set(key, config, CacheKeys.PushMsgUserConfigCacheSecs);
}
else
{
config = await cacheProvider.Get(key);
await cacheProvider.SetExpiration(key, CacheKeys.PushMsgUserConfigCacheSecs);
}
return config;
}
///
/// 判断用户的通知配置
///
public static async Task CheckPushConfig(this DbRESTFulRepository repository, string configPropName, RedisCacheProvider cacheProvider, long targetUserId)
{
// 发送通知
UserMessagePushConfig config = await repository.GetUserMessagePushConfig(cacheProvider, targetUserId);
// 判断是否需要给这个用户推送消息,如果设置了不推送,则忽略
if (config == null || !(config.all || (bool)config.GetType().GetProperty(configPropName).GetValue(config)))
{
return true;
}
return false;
}
///
/// 关注某一个用户,对于同一ID反复关注同一ID,24小时内只提醒一次
///
/// 关注用户Id
/// 被关注的用户Id
///
public async static Task PushMsgCheckFocusRepeatability(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long fromUserId, long toUserId)
{
// 检查Redis中是否有此用户的点赞记录,如果有,则返回False
var key = CacheKeys.PushMsgFocusRepeatability(fromUserId, toUserId);
if (await cacheProvider.Get(key) != null)
{
return false;
}
return true;
}
public async static Task PushMsgCheckFocusRepeatabilityAdd(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long fromUserId, long toUserId)
{
// 检查Redis中是否有此用户的点赞记录,如果有,则返回False
var key = CacheKeys.PushMsgFocusRepeatability(fromUserId, toUserId);
if (await cacheProvider.Get(key) != null)
{
return;
}
await cacheProvider.Set(key, 1, CacheKeys.PushMsgFocusUserCacheSecs);
}
///
/// 检查是否需要给用户发送极光推送信息。用户一个小时内只能收到前2个关注通知,一天内最多收3个关注通知。
///
/// 收到通知消息的用户Id
public async static Task PushMsgCheckFocusCount(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long toUserId)
{
// 检查用户1个小时内收到关注通知数量
var key1 = CacheKeys.PushMsgFocusReceivePerHour(toUserId);
if (await cacheProvider.KeyExist(key1))
{
var count = await cacheProvider.Get(key1);
if (count >= 2)
{
return false;
}
}
// 检查用户1天内收到关注通知数量
var key2 = CacheKeys.PushMsgFocusReceivePerDay(toUserId);
if (await cacheProvider.KeyExist(key2))
{
var count = await cacheProvider.Get(key2);
if (count >= 3)
{
return false;
}
}
return true;
}
public async static Task PushMsgCheckFocusCountAdd(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long toUserId)
{
// 检查用户1个小时内收到关注通知数量
var needAddKey1 = false;
var key1 = CacheKeys.PushMsgFocusReceivePerHour(toUserId);
if (await cacheProvider.KeyExist(key1))
{
await cacheProvider.Increase(key1);
}
else
{
needAddKey1 = true;
}
// 检查用户1天内收到关注通知数量
var key2 = CacheKeys.PushMsgFocusReceivePerDay(toUserId);
var needAddKey2 = false;
if (await cacheProvider.KeyExist(key2))
{
await cacheProvider.Increase(key2);
}
else
{
needAddKey2 = true;
}
if (needAddKey1) await cacheProvider.SetString(key1, "1", 60 * 60);
if (needAddKey2) await cacheProvider.SetString(key2, "1", 60 * 60 * 24);
}
///
/// 给用户发送点赞通知,规则:对于同一类型(文章、评论、回复)用户A,一天内限收一条用户B的点赞通知
///
/// 点赞人的Id
/// 0 动态 1 评论 2 回复
/// 对应的Id
/// 是否可以推送
public async static Task PushMsgCheckThumbsupMessage(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long fromUserId, ThumbsupTargetType type, long targetId)
{
// 检查Redis中是否有此用户的点赞记录,如果有,则返回False
var key = CacheKeys.PushMsgThumbsupRepeatability(fromUserId, type, targetId);
if (!(await cacheProvider.KeyExist(key)))
{
return true;
}
return false;
}
public async static Task PushMsgCheckThumbsupMessageAdd(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long fromUserId, ThumbsupTargetType type, long targetId)
{
// 检查Redis中是否有此用户的点赞记录,如果有,则返回False
var key = CacheKeys.PushMsgThumbsupRepeatability(fromUserId, type, targetId);
if (!(await cacheProvider.KeyExist(key)))
{
await cacheProvider.Set(key, 1, CacheKeys.PushMsgThumbsupCacheSecs);
}
}
///
/// 检查是否需要给用户发送极光推送信息。用户一个小时内只能收到前2个点赞通知,一天内最多收3个点赞通知。
///
/// 收到通知消息的用户Id
public async static Task PushMsgCheckThumbsupCount(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long toUserId)
{
//var key1 = CacheKeys.PushMsgThumbsupReceivePerMin(toUserId);
//if (await cacheProvider.KeyExist(key1))
//{
// if (await cacheProvider.KeyExist(key1))
// {
// return false;
// }
//}
var key2 = CacheKeys.PushMsgThumbsupReceivePerHour(toUserId);
if (await cacheProvider.KeyExist(key2))
{
var count = await cacheProvider.Get(key2);
if (count >= 2)
{
return false;
}
}
var key3 = CacheKeys.PushMsgThumbsupReceivePerDay(toUserId);
if (await cacheProvider.KeyExist(key3))
{
var count = await cacheProvider.Get(key3);
if (count >= 3)
{
return false;
}
}
return true;
}
public async static Task PushMsgCheckThumbsupCountAdd(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long toUserId)
{
var key1 = CacheKeys.PushMsgThumbsupReceivePerMin(toUserId);
var key2 = CacheKeys.PushMsgThumbsupReceivePerHour(toUserId);
var key3 = CacheKeys.PushMsgThumbsupReceivePerDay(toUserId);
await cacheProvider.SetString(key1, "1", CacheKeys.PushMsgThumbsupReceivePerMinCacheSecs);
if (await cacheProvider.KeyExist(key2))
{
await cacheProvider.Increase(key2);
}
else
{
await cacheProvider.SetString(key2, "1", CacheKeys.PushMsgThumbsupReceivePerHourCacheSecs);
}
if (await cacheProvider.KeyExist(key3))
{
await cacheProvider.Increase(key3);
}
else
{
await cacheProvider.SetString(key3, "1", CacheKeys.PushMsgThumbsupReceivePerDayCacheSecs);
}
}
///
/// 给用户发送评论通知,规则:同一ID对另一ID用户,一天最多3次评论,除非楼主回复了后,再进行提醒(清除逻辑放在了评论通知中)
///
/// 评论的人
/// 被评论的人
///
public async static Task PushMsgCheckCommentPerDay(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long fromUserId, long toUserId)
{
// 检查Redis中是否有此用户的点赞记录,如果有,则返回False
var key = CacheKeys.PushMsgCommentPertDay(fromUserId, toUserId);
if (await cacheProvider.KeyExist(key))
{
var count = await cacheProvider.Get(key);
if (count > 3)
{
return false;
}
}
return true;
}
public async static Task PushMsgCheckCommentPerDayAdd(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long fromUserId, long toUserId)
{
// 检查Redis中是否有此用户的点赞记录,如果有,则返回False
var key = CacheKeys.PushMsgCommentPertDay(fromUserId, toUserId);
if (await cacheProvider.KeyExist(key))
{
await cacheProvider.Increase(key);
}
else
{
await cacheProvider.Set(key, 1, CacheKeys.PushMsgCommentPerDayCacheSecs);
}
}
///
/// 检查是否需要给用户发送极光推送信息。收到评论的用户一个小时内只能收到前4个评论通知,一天内最多收20个评论通知
///
/// 收到通知消息的用户Id
public async static Task PushMsgCheckCommentReceive(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long toUserId)
{
// 检查用户1个小时内收到评论通知数量
var key1 = CacheKeys.PushMsgCommentReceivePerHour(toUserId);
if (await cacheProvider.KeyExist(key1))
{
var count = await cacheProvider.Get(key1);
if (count >= 4)
{
return false;
}
}
// 检查用户1天内收到评论通知数量
var key2 = CacheKeys.PushMsgCommentReceivePerDay(toUserId);
if (await cacheProvider.KeyExist(key2))
{
var count = await cacheProvider.Get(key2);
if (count >= 20)
{
return false;
}
}
return true;
}
public async static Task PushMsgCheckCommentReceiveAdd(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, long toUserId)
{
// 检查用户1个小时内收到评论通知数量
var needAddKey1 = false;
var key1 = CacheKeys.PushMsgCommentReceivePerHour(toUserId);
if (await cacheProvider.KeyExist(key1))
{
await cacheProvider.Increase(key1);
}
else
{
needAddKey1 = true;
}
// 检查用户1天内收到评论通知数量
var key2 = CacheKeys.PushMsgCommentReceivePerDay(toUserId);
var needAddKey2 = false;
if (await cacheProvider.KeyExist(key2))
{
await cacheProvider.Increase(key2);
}
else
{
needAddKey2 = true;
}
if (needAddKey1) await cacheProvider.SetString(key1, "1", CacheKeys.PushMsgCommentReceivePerHourCacheSecs);
if (needAddKey2) await cacheProvider.SetString(key2, "1", CacheKeys.PushMsgCommentReceivePerDayCacheSecs);
}
}
}