public async Task ProcessAsync(Sisters.WudiLib.Posts.Message message, HttpApiClient api) { // TODO 验证用户名是否合法 var(success, userInfo) = await OsuApi.GetUserInfoAsync(_userName, OsuMixedApi.Mode.Standard); if (!success) { await api.SendMessageAsync(message.Endpoint, "网络错误。"); return; } if (userInfo == null) { await api.SendMessageAsync(message.Endpoint, "没有此用户。"); return; } var dbResult = await Database.AddNewBindAsync(message.UserId, userInfo.Id, userInfo.Name, "自己绑定", message.UserId, userInfo.Name); if (dbResult.Success) { await api.SendMessageAsync(message.Endpoint, $"成功绑定为{userInfo.Name}。"); } else if (dbResult.Exception is DbUpdateException && dbResult.Exception.InnerException?.Message.Contains("Duplicate", StringComparison.Ordinal) == true) { await api.SendMessageAsync(message.Endpoint, "在已绑定的情况下不允许修改,如需修改请联系 bleatingsheep。"); } else { await api.SendMessageAsync(message.Endpoint, "数据库访问错误。"); FLogger.LogException(dbResult.Exception); } }
public async Task RunAsync(HttpApiClient api) { var result = await Database.GetPlusRecordedUsersAsync(); if (!result.Success) { FLogger.LogInBackground("更新 PP+ 数据时访问数据库失败。"); FLogger.LogException(result.Exception); return; } IEnumerable <int> todo = result.Result; Logger.Info($"找到{todo.Count()}个查询过的玩家。"); int retry = 10; do { const int threads = 10; Logger.Debug($"开始查询,线程数为{threads.ToString(CultureInfo.InvariantCulture)}"); var failed = new ConcurrentBag <int>(); var results = new ConcurrentBag <IUserPlus>(); Parallel.ForEach(todo, new ParallelOptions { MaxDegreeOfParallelism = threads, }, userId => { try { var user = s_spider.GetUserPlusAsync(userId).ConfigureAwait(false).GetAwaiter().GetResult(); if (user != null) { results.Add(user); } } catch (Exception) { failed.Add(userId); } }); Logger.Info($"查询成功{results.Count}条。"); Logger.Info($"失败{failed.Count}条,首个失败是{failed.FirstOrDefault()}"); var addResult = await Database.AddPlusHistoryRangeAsync(results); if (!addResult.Success) { FLogger.LogInBackground("添加新的 PP+ 数据失败。"); FLogger.LogException(addResult.Exception); } todo = failed.ToList(); await Task.Delay(600_000); retry--; } while (todo.Any() && retry > 0); }
public async Task ProcessAsync(Sisters.WudiLib.Posts.Message message, HttpApiClient api) { dynamic query; if (!string.IsNullOrWhiteSpace(queryUser)) { bool success; (success, query) = await GetUserKey(queryUser); if (!success) { await api.SendMessageAsync(message.Endpoint, "查询失败。"); return; } if (query is null) { await api.SendMessageAsync(message.Endpoint, "查无此人。"); return; } } else { var(success, userId) = await DataProvider.GetBindingIdAsync(message.UserId); if (!success) { await api.SendMessageAsync(message.Endpoint, "查询绑定账号失败。"); return; } if (userId == null) { await api.SendMessageAsync(message.Endpoint, "未绑定。请发送“绑定”后跟你的用户名进行绑定。"); return; } query = userId.Value; } try { var userPlus = (UserPlus)await s_spider.GetUserPlusAsync(query); if (userPlus == null) { await api.SendMessageAsync(message.Endpoint, string.IsNullOrWhiteSpace(queryUser)? "被办了。" : "查无此人。"); return; } var oldQuery = await Database.GetRecentPlusHistory(userPlus.Id); if (!oldQuery.Success) { await api.SendMessageAsync(message.Endpoint, "无法找到历史数据。"); FLogger.LogException(oldQuery.Exception); } var old = oldQuery.EnsureSuccess().Result; var responseMessage = old == null ? $@"{userPlus.Name} 的 PP+ 数据 Performance: {userPlus.Performance} Aim (Jump): {userPlus.AimJump} Aim (Flow): {userPlus.AimFlow} Precision: {userPlus.Precision} Speed: {userPlus.Speed} Stamina: {userPlus.Stamina} Accuracy: {userPlus.Accuracy}" : $@"{userPlus.Name} 的 PP+ 数据 Performance: {userPlus.Performance}{userPlus.Performance - old.Performance: (+#); (-#); ;} Aim (Jump): {userPlus.AimJump}{userPlus.AimJump - old.AimJump: (+#); (-#); ;} Aim (Flow): {userPlus.AimFlow}{userPlus.AimFlow - old.AimFlow: (+#); (-#); ;} Precision: {userPlus.Precision}{userPlus.Precision - old.Precision: (+#); (-#); ;} Speed: {userPlus.Speed}{userPlus.Speed - old.Speed: (+#); (-#); ;} Stamina: {userPlus.Stamina}{userPlus.Stamina - old.Stamina: (+#); (-#); ;} Accuracy: {userPlus.Accuracy}{userPlus.Accuracy - old.Accuracy: (+#); (-#); ;}"; if (message is GroupMessage g && g.GroupId == 758120648) { //responseMessage += $"\r\n化学式没付钱指数:{C8Mod.CostOf(userPlus):0.0}"; responseMessage = C8Mod.ModPerformancePlus(responseMessage, old, userPlus); } await api.SendMessageAsync(message.Endpoint, responseMessage); if (old == null) { var addResult = await Database.AddPlusHistoryAsync(userPlus); if (!addResult.Success) { FLogger.LogException(addResult.Exception); } } } catch (ExceptionPlus) { await api.SendMessageAsync(message.Endpoint, "查询PP+失败。"); return;