spark-server/deploy/popadmin/price-package-patch/AppClientService.java
DESKTOP-L8OUL9F\gfl0034 5d05eb0804 chore(deploy): geo snippet、popadmin 补丁与订阅包名脚本
补充 world geo nginx snippet、OpenAPI/geo 热更新脚本,以及 popadmin package_name 定价补丁,便于运维对齐。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-30 09:17:18 +08:00

577 lines
29 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.aliyun.control.exception.BusinessException
* com.fasterxml.jackson.databind.ObjectMapper
* com.wyrs.admin.config.WyrsAppRegistry
* com.wyrs.admin.dto.AdPlacementClientDto
* com.wyrs.admin.dto.DeveloperAppClientItem
* com.wyrs.admin.dto.FeedbackSubmitRequest
* com.wyrs.admin.dto.GeoInfo
* com.wyrs.admin.dto.PaymentSubmitRequest
* com.wyrs.admin.entity.AppBanner
* com.wyrs.admin.entity.AppUser
* com.wyrs.admin.entity.AppVersion
* com.wyrs.admin.entity.ChannelDailyStat
* com.wyrs.admin.entity.ClientLog
* com.wyrs.admin.entity.CountryDailyStat
* com.wyrs.admin.entity.DailyActiveStat
* com.wyrs.admin.entity.MembershipPrice
* com.wyrs.admin.entity.PaymentRecord
* com.wyrs.admin.entity.UserFeedback
* com.wyrs.admin.entity.UserShareEvent
* com.wyrs.admin.repository.AppUserRepository
* com.wyrs.admin.repository.ChannelDailyStatRepository
* com.wyrs.admin.repository.ClientLogRepository
* com.wyrs.admin.repository.CountryDailyStatRepository
* com.wyrs.admin.repository.DailyActiveStatRepository
* com.wyrs.admin.repository.PaymentRecordRepository
* com.wyrs.admin.repository.UserFeedbackRepository
* com.wyrs.admin.repository.UserShareEventRepository
* com.wyrs.admin.security.ClientApiAuthException
* com.wyrs.admin.service.AdminStatsService
* com.wyrs.admin.service.AppClientService
* com.wyrs.admin.service.AppClientService$HeartbeatRequest
* com.wyrs.admin.service.AppClientService$ShareRequest
* com.wyrs.admin.service.BannerStateService
* com.wyrs.admin.service.CountryResolveService
* com.wyrs.admin.service.DauDedupService
* com.wyrs.admin.service.DefaultAvatarService
* com.wyrs.admin.service.DiscordFeedbackNotifier
* com.wyrs.admin.service.OnlineDeviceTracker
* com.wyrs.admin.service.SparkUserOpsStore
* com.wyrs.admin.service.config.AdPlacementsConfigService
* com.wyrs.admin.service.config.AppClientFeatureConfigService
* com.wyrs.admin.service.config.AppWhitelistConfigService
* com.wyrs.admin.service.config.BannersConfigService
* com.wyrs.admin.service.config.DeveloperAppsConfigService
* com.wyrs.admin.service.config.PricesConfigService
* com.wyrs.admin.service.config.VersionsConfigService
* com.wyrs.admin.util.AppChannelNames
* com.wyrs.admin.util.ClientIpUtils
* com.wyrs.admin.util.CountryNames
* com.wyrs.admin.util.DefaultAvatarPool
* com.wyrs.admin.util.TestDevicePatterns
* com.wyrs.admin.util.WyrsClientLanguage
* jakarta.servlet.http.HttpServletRequest
* org.springframework.core.env.Environment
* org.springframework.http.HttpStatus
* org.springframework.stereotype.Service
* org.springframework.transaction.annotation.Transactional
*/
package com.wyrs.admin.service;
import com.aliyun.control.exception.BusinessException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wyrs.admin.config.WyrsAppRegistry;
import com.wyrs.admin.dto.AdPlacementClientDto;
import com.wyrs.admin.dto.DeveloperAppClientItem;
import com.wyrs.admin.dto.FeedbackSubmitRequest;
import com.wyrs.admin.dto.GeoInfo;
import com.wyrs.admin.dto.PaymentSubmitRequest;
import com.wyrs.admin.entity.AppBanner;
import com.wyrs.admin.entity.AppUser;
import com.wyrs.admin.entity.AppVersion;
import com.wyrs.admin.entity.ChannelDailyStat;
import com.wyrs.admin.entity.ClientLog;
import com.wyrs.admin.entity.CountryDailyStat;
import com.wyrs.admin.entity.DailyActiveStat;
import com.wyrs.admin.entity.MembershipPrice;
import com.wyrs.admin.entity.PaymentRecord;
import com.wyrs.admin.entity.UserFeedback;
import com.wyrs.admin.entity.UserShareEvent;
import com.wyrs.admin.repository.AppUserRepository;
import com.wyrs.admin.repository.ChannelDailyStatRepository;
import com.wyrs.admin.repository.ClientLogRepository;
import com.wyrs.admin.repository.CountryDailyStatRepository;
import com.wyrs.admin.repository.DailyActiveStatRepository;
import com.wyrs.admin.repository.PaymentRecordRepository;
import com.wyrs.admin.repository.UserFeedbackRepository;
import com.wyrs.admin.repository.UserShareEventRepository;
import com.wyrs.admin.security.ClientApiAuthException;
import com.wyrs.admin.service.AdminStatsService;
import com.wyrs.admin.service.AppClientService;
import com.wyrs.admin.service.BannerStateService;
import com.wyrs.admin.service.CountryResolveService;
import com.wyrs.admin.service.DauDedupService;
import com.wyrs.admin.service.DefaultAvatarService;
import com.wyrs.admin.service.DiscordFeedbackNotifier;
import com.wyrs.admin.service.OnlineDeviceTracker;
import com.wyrs.admin.service.SparkUserOpsStore;
import com.wyrs.admin.service.config.AdPlacementsConfigService;
import com.wyrs.admin.service.config.AppClientFeatureConfigService;
import com.wyrs.admin.service.config.AppWhitelistConfigService;
import com.wyrs.admin.service.config.BannersConfigService;
import com.wyrs.admin.service.config.DeveloperAppsConfigService;
import com.wyrs.admin.service.config.PricesConfigService;
import com.wyrs.admin.service.config.VersionsConfigService;
import com.wyrs.admin.util.AppChannelNames;
import com.wyrs.admin.util.ClientIpUtils;
import com.wyrs.admin.util.CountryNames;
import com.wyrs.admin.util.DefaultAvatarPool;
import com.wyrs.admin.util.TestDevicePatterns;
import com.wyrs.admin.util.WyrsClientLanguage;
import jakarta.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/*
* Exception performing whole class analysis ignored.
*/
@Service
public class AppClientService {
private final AppUserRepository appUserRepository;
private final ClientLogRepository clientLogRepository;
private final UserFeedbackRepository userFeedbackRepository;
private final DailyActiveStatRepository dailyActiveStatRepository;
private final ChannelDailyStatRepository channelDailyStatRepository;
private final DauDedupService dauDedupService;
private final PaymentRecordRepository paymentRecordRepository;
private final UserShareEventRepository userShareEventRepository;
private final CountryDailyStatRepository countryDailyStatRepository;
private final CountryResolveService countryResolveService;
private final BannerStateService bannerStateService;
private final BannersConfigService bannersConfigService;
private final VersionsConfigService versionsConfigService;
private final PricesConfigService pricesConfigService;
private final DeveloperAppsConfigService developerAppsConfigService;
private final AdPlacementsConfigService adPlacementsConfigService;
private final AppWhitelistConfigService appWhitelistConfigService;
private final AppClientFeatureConfigService appClientFeatureConfigService;
private final SparkUserOpsStore sparkUserOpsStore;
private final OnlineDeviceTracker onlineDeviceTracker;
private final Environment environment;
private final DiscordFeedbackNotifier discordFeedbackNotifier;
private final DefaultAvatarService defaultAvatarService;
public void validateApp(String appCode) {
if (!WyrsAppRegistry.isValid((String)appCode)) {
throw new ClientApiAuthException("\u672a\u77e5 App: " + appCode, HttpStatus.NOT_FOUND);
}
}
@Transactional
public AppUser heartbeat(String appCode, HeartbeatRequest req, HttpServletRequest request) {
boolean firstSeenToday;
String resolvedCountry;
this.validateApp(appCode);
if (req.getDeviceId() == null || req.getDeviceId().isBlank()) {
throw new BusinessException("deviceId \u4e0d\u80fd\u4e3a\u7a7a");
}
if (this.isProdProfile() && TestDevicePatterns.isSimulatedDevice((String)req.getDeviceId(), (String)req.getNickname())) {
throw new BusinessException("\u65e0\u6548\u7684 deviceId");
}
String channel = AppClientService.normalizeChannel((String)req.getChannel());
String clientIp = ClientIpUtils.resolve((HttpServletRequest)request);
Integer clientPort = ClientIpUtils.resolvePort((HttpServletRequest)request);
GeoInfo geo = this.countryResolveService.resolveGeo(request);
String country = req.getCountry() != null && !req.getCountry().isBlank() ? CountryNames.normalize((String)req.getCountry()) : geo.countryCode();
String city = geo.city() != null ? geo.city() : geo.region();
Optional existing = this.appUserRepository.findByAppCodeAndDeviceId(appCode, req.getDeviceId());
boolean isNew = existing.isEmpty();
LocalDate today = AdminStatsService.todayInChina();
LocalDateTime dayStart = today.atStartOfDay();
LocalDateTime dayEnd = today.plusDays(1L).atStartOfDay();
LocalDateTime prevActive = existing.map(AppUser::getLastActiveAt).orElse(null);
boolean alreadyActiveToday = prevActive != null && !prevActive.isBefore(dayStart) && prevActive.isBefore(dayEnd);
AppUser user = existing.orElseGet(() -> AppUser.builder().appCode(appCode).deviceId(req.getDeviceId()).channel(channel).country(country).registerIp(clientIp).registerPort(clientPort).registerCity(city).build());
boolean dirty = isNew;
if (isNew) {
user.setRegisterIp(clientIp);
user.setRegisterPort(clientPort);
user.setRegisterCity(city);
if (DefaultAvatarPool.isBlank((String)user.getAvatarUrl())) {
String seed = req.getEmail() != null && !req.getEmail().isBlank() ? req.getEmail() : req.getDeviceId();
user.setAvatarUrl(this.defaultAvatarService.pickStable(seed));
}
}
if (req.getPhone() != null && !Objects.equals(req.getPhone(), user.getPhone())) {
user.setPhone(req.getPhone());
dirty = true;
}
if (req.getNickname() != null && !Objects.equals(req.getNickname(), user.getNickname())) {
user.setNickname(req.getNickname());
dirty = true;
}
if (req.getPlatform() != null && !Objects.equals(req.getPlatform(), user.getPlatform())) {
user.setPlatform(req.getPlatform());
dirty = true;
}
if (req.getAppVersion() != null && !Objects.equals(req.getAppVersion(), user.getAppVersion())) {
user.setAppVersion(req.getAppVersion());
dirty = true;
}
if (user.getChannel() == null || user.getChannel().isBlank()) {
user.setChannel(channel);
dirty = true;
}
if (country != null && !"UN".equals(country)) {
if (!Objects.equals(country, user.getCountry())) {
user.setCountry(country);
dirty = true;
}
} else if (user.getCountry() == null || user.getCountry().isBlank()) {
user.setCountry(country);
dirty = true;
}
if (!Objects.equals(clientIp, user.getLastActiveIp())) {
user.setLastActiveIp(clientIp);
dirty = true;
}
if (!Objects.equals(clientPort, user.getLastActivePort())) {
user.setLastActivePort(clientPort);
dirty = true;
}
if (city != null && !Objects.equals(city, user.getLastActiveCity())) {
user.setLastActiveCity(city);
dirty = true;
}
if (user.getRegisterIp() == null || user.getRegisterIp().isBlank()) {
user.setRegisterIp(clientIp);
dirty = true;
}
if (user.getRegisterPort() == null && clientPort != null) {
user.setRegisterPort(clientPort);
dirty = true;
}
if ((user.getRegisterCity() == null || user.getRegisterCity().isBlank()) && city != null) {
user.setRegisterCity(city);
dirty = true;
}
LocalDateTime now = LocalDateTime.now(AdminStatsService.CHINA_ZONE);
if (!alreadyActiveToday) {
user.setLastActiveAt(now);
dirty = true;
}
if (Boolean.TRUE.equals(user.getBanned())) {
throw new BusinessException("\u8d26\u53f7\u5df2\u5c01\u7981", HttpStatus.FORBIDDEN);
}
if (dirty) {
user = (AppUser)this.appUserRepository.save((Object)user);
}
String string = resolvedCountry = user.getCountry() != null ? user.getCountry() : country;
if (!alreadyActiveToday && (firstSeenToday = this.dauDedupService.tryMarkFirstActive(appCode, req.getDeviceId(), today, channel, resolvedCountry, now))) {
this.bumpDau(appCode, channel, isNew);
this.bumpCountryDau(appCode, resolvedCountry, isNew);
}
String publicId = AppWhitelistConfigService.normalizePublicId((String)req.getPublicId());
String email = AppWhitelistConfigService.normalizeEmail((String)req.getEmail());
boolean whitelisted = this.appWhitelistConfigService.isWhitelisted(appCode, publicId, email);
user.setWhitelist(Boolean.valueOf(whitelisted));
user.setFamilySharingEnabled(Boolean.valueOf(this.appClientFeatureConfigService.isFamilySharingEnabled(appCode)));
user.setPublicId(publicId);
if (email != null && !email.isBlank()) {
user.setEmail(email);
this.appUserRepository.save((Object)user);
if ("spark".equals(appCode) || "pop".equals(appCode)) {
this.sparkUserOpsStore.touchDevice(email, req.getDeviceId(), req.getPlatform(), req.getAppVersion(), clientIp, clientPort, city);
}
}
this.onlineDeviceTracker.touch(appCode, req.getDeviceId());
return user;
}
public ClientLog reportLog(String appCode, ClientLog log) {
this.validateApp(appCode);
log.setAppCode(appCode);
if (log.getCreatedAt() == null) {
log.setCreatedAt(LocalDateTime.now());
}
this.enrichClientLogIdentity(log);
if (log.getLevel() == null || log.getLevel().isBlank()) {
String msg;
String string = msg = log.getMessage() == null ? "" : log.getMessage().toLowerCase();
if (msg.contains("crash") || msg.contains("fatal") || msg.contains("uncaughtexception") || msg.contains("\u5d29\u6e83")) {
log.setLevel("crash");
} else {
log.setLevel("info");
}
} else {
log.setLevel(log.getLevel().trim().toLowerCase());
}
return (ClientLog)this.clientLogRepository.save((Object)log);
}
private void enrichClientLogIdentity(ClientLog log) {
if (log.getEmail() != null && !log.getEmail().isBlank()) {
log.setEmail(log.getEmail().trim().toLowerCase());
}
if (log.getDeviceId() != null) {
log.setDeviceId(log.getDeviceId().trim());
}
if (log.getDeviceModel() != null) {
log.setDeviceModel(log.getDeviceModel().trim());
}
this.parseDeviceInfoJson(log);
if ((log.getEmail() == null || log.getEmail().isBlank() || log.getDeviceModel() == null) && log.getUserId() != null) {
this.appUserRepository.findById((Object)log.getUserId()).ifPresent(u -> {
if ((log.getEmail() == null || log.getEmail().isBlank()) && u.getEmail() != null && !u.getEmail().isBlank()) {
log.setEmail(u.getEmail().trim().toLowerCase());
}
if ((log.getDeviceId() == null || log.getDeviceId().isBlank()) && u.getDeviceId() != null) {
log.setDeviceId(u.getDeviceId());
}
});
}
if ((log.getEmail() == null || log.getEmail().isBlank()) && log.getDeviceId() != null && !log.getDeviceId().isBlank()) {
this.appUserRepository.findByAppCodeAndDeviceId(log.getAppCode(), log.getDeviceId()).ifPresent(u -> {
if (u.getEmail() != null && !u.getEmail().isBlank()) {
log.setEmail(u.getEmail().trim().toLowerCase());
}
if (log.getUserId() == null) {
log.setUserId(u.getId());
}
});
}
}
private void parseDeviceInfoJson(ClientLog log) {
String raw = log.getDeviceInfo();
if (raw == null || raw.isBlank() || !raw.trim().startsWith("{")) {
if ((log.getDeviceModel() == null || log.getDeviceModel().isBlank()) && raw != null && !raw.isBlank() && raw.length() <= 128) {
log.setDeviceModel(raw.trim());
}
return;
}
try {
Object v;
Map map = (Map)new ObjectMapper().readValue(raw, Map.class);
if ((log.getDeviceId() == null || log.getDeviceId().isBlank()) && (v = AppClientService.first((Map)map, (String[])new String[]{"deviceId", "device_id", "uuid"})) != null) {
log.setDeviceId(String.valueOf(v).trim());
}
if ((log.getEmail() == null || log.getEmail().isBlank()) && (v = AppClientService.first((Map)map, (String[])new String[]{"email", "account", "userEmail"})) != null && String.valueOf(v).contains("@")) {
log.setEmail(String.valueOf(v).trim().toLowerCase());
}
if (log.getDeviceModel() == null || log.getDeviceModel().isBlank()) {
v = AppClientService.first((Map)map, (String[])new String[]{"deviceModel", "model", "phoneModel", "device", "brandModel"});
if (v != null) {
log.setDeviceModel(String.valueOf(v).trim());
} else {
String bm;
Object brand = AppClientService.first((Map)map, (String[])new String[]{"brand", "manufacturer"});
Object model = AppClientService.first((Map)map, (String[])new String[]{"model", "device"});
if (!(brand == null && model == null || (bm = (String.valueOf(brand == null ? "" : brand) + " " + String.valueOf(model == null ? "" : model)).trim()).isBlank())) {
log.setDeviceModel(bm);
}
}
}
}
catch (Exception exception) {
// empty catch block
}
}
private static Object first(Map<String, Object> map, String ... keys) {
for (String k : keys) {
String s;
if (!map.containsKey(k) || map.get(k) == null || (s = String.valueOf(map.get(k)).trim()).isEmpty() || "null".equalsIgnoreCase(s)) continue;
return map.get(k);
}
return null;
}
public UserFeedback feedback(String appCode, FeedbackSubmitRequest req) {
this.validateApp(appCode);
UserFeedback fb = new UserFeedback();
fb.setAppCode(appCode);
fb.setUserId(req.getUserId());
fb.setContent(req.getContent());
fb.setContact(req.getContact());
fb.setStatus("pending");
fb.setCreatedAt(LocalDateTime.now());
fb = (UserFeedback)this.userFeedbackRepository.save((Object)fb);
this.discordFeedbackNotifier.notifyFeedbackAsync(fb);
return fb;
}
public PaymentRecord payment(String appCode, PaymentSubmitRequest req) {
this.validateApp(appCode);
PaymentRecord record = new PaymentRecord();
record.setAppCode(appCode);
record.setUserId(req.getUserId());
record.setOrderId(req.getOrderId());
record.setThirdPartyOrderId(req.getThirdPartyOrderId());
record.setAmount(req.getAmount());
record.setProductId(req.getProductId());
record.setStatus(req.getStatus() != null ? req.getStatus() : "pending");
record.setPayChannel(req.getPayChannel());
record.setSimulated(req.getSimulated());
record.setPaymentType(req.getPaymentType());
record.setPaidAt(req.getPaidAt());
record.setCreatedAt(LocalDateTime.now());
AppClientService.normalizePayment((PaymentRecord)record);
return (PaymentRecord)this.paymentRecordRepository.save((Object)record);
}
public UserFeedback feedback(String appCode, UserFeedback fb) {
this.validateApp(appCode);
fb.setAppCode(appCode);
if (fb.getStatus() == null) {
fb.setStatus("pending");
}
if (fb.getCreatedAt() == null) {
fb.setCreatedAt(LocalDateTime.now());
}
fb = (UserFeedback)this.userFeedbackRepository.save((Object)fb);
this.discordFeedbackNotifier.notifyFeedbackAsync(fb);
return fb;
}
public PaymentRecord payment(String appCode, PaymentRecord record) {
this.validateApp(appCode);
record.setAppCode(appCode);
if (record.getCreatedAt() == null) {
record.setCreatedAt(LocalDateTime.now());
}
if (record.getStatus() == null) {
record.setStatus("pending");
}
AppClientService.normalizePayment((PaymentRecord)record);
return (PaymentRecord)this.paymentRecordRepository.save((Object)record);
}
private static void normalizePayment(PaymentRecord record) {
boolean isSimulated;
boolean bl = isSimulated = Boolean.TRUE.equals(record.getSimulated()) || AppClientService.isSimulatedMarker((String)record.getPayChannel()) || AppClientService.isSimulatedMarker((String)record.getPaymentType());
if (isSimulated) {
record.setSimulated(Boolean.valueOf(true));
record.setPayChannel("simulate");
} else if (record.getSimulated() == null) {
record.setSimulated(Boolean.valueOf(false));
}
if ("paid".equalsIgnoreCase(record.getStatus()) && record.getPaidAt() == null) {
record.setPaidAt(LocalDateTime.now());
}
if (record.getThirdPartyOrderId() != null) {
record.setThirdPartyOrderId(record.getThirdPartyOrderId().trim());
if (record.getThirdPartyOrderId().isEmpty()) {
record.setThirdPartyOrderId(null);
}
}
}
private static boolean isSimulatedMarker(String value) {
if (value == null || value.isBlank()) {
return false;
}
String s = value.trim().toLowerCase(Locale.ROOT);
return "simulate".equals(s) || "mock".equals(s) || "simulated".equals(s);
}
public UserShareEvent share(String appCode, ShareRequest req) {
this.validateApp(appCode);
UserShareEvent event = UserShareEvent.builder().appCode(appCode).userId(req.getUserId()).deviceId(req.getDeviceId()).shareTarget(req.getShareTarget()).channel(AppClientService.normalizeChannel((String)req.getChannel())).build();
event = (UserShareEvent)this.userShareEventRepository.save((Object)event);
this.bumpShareCount(appCode, AppClientService.normalizeChannel((String)req.getChannel()));
return event;
}
public AppVersion latestVersion(String appCode) {
this.validateApp(appCode);
return this.versionsConfigService.latestVersion(appCode).orElse(null);
}
public List<AppBanner> enabledBanners(String appCode) {
this.validateApp(appCode);
return this.bannerStateService.filterEnabled(this.bannersConfigService.findByAppCodeOrderBySortOrderAsc(appCode));
}
public List<MembershipPrice> enabledPrices(String appCode) {
this.validateApp(appCode);
return this.pricesConfigService.findByAppCodeAndEnabledTrueOrderByPriceAsc(appCode);
}
public List<DeveloperAppClientItem> developerApps(String appCode, HttpServletRequest request, String channel) {
this.validateApp(appCode);
return this.developerAppsConfigService.findEnabledClientItems(appCode, WyrsClientLanguage.resolve((HttpServletRequest)request), channel);
}
public AdPlacementClientDto adPlacements(String appCode) {
this.validateApp(appCode);
return this.adPlacementsConfigService.findOneByAppCode(appCode).map(p -> AdPlacementClientDto.builder().appId(p.getAppId()).splashPlacementId(p.getSplashPlacementId()).bannerPlacementId(p.getBannerPlacementId()).interstitialPlacementId(p.getInterstitialPlacementId()).build()).orElseGet(AdPlacementClientDto::new);
}
private void bumpDau(String appCode, String channel, boolean isNew) {
LocalDate today = AdminStatsService.todayInChina();
DailyActiveStat stat = this.dailyActiveStatRepository.findByAppCodeAndStatDate(appCode, today).orElseGet(() -> DailyActiveStat.builder().appCode(appCode).statDate(today).activeUsers(Long.valueOf(0L)).newUsers(Long.valueOf(0L)).build());
stat.setActiveUsers(Long.valueOf(stat.getActiveUsers() + 1L));
if (isNew) {
stat.setNewUsers(Long.valueOf(stat.getNewUsers() + 1L));
}
this.dailyActiveStatRepository.save((Object)stat);
ChannelDailyStat channelStat = this.channelDailyStatRepository.findByAppCodeAndStatDateAndChannel(appCode, today, channel).orElseGet(() -> ChannelDailyStat.builder().appCode(appCode).statDate(today).channel(channel).activeUsers(Long.valueOf(0L)).newUsers(Long.valueOf(0L)).shareCount(Long.valueOf(0L)).build());
channelStat.setActiveUsers(Long.valueOf(channelStat.getActiveUsers() + 1L));
if (isNew) {
channelStat.setNewUsers(Long.valueOf(channelStat.getNewUsers() + 1L));
}
this.channelDailyStatRepository.save((Object)channelStat);
}
private void bumpCountryDau(String appCode, String country, boolean isNew) {
String code = CountryNames.normalize((String)country);
LocalDate today = AdminStatsService.todayInChina();
CountryDailyStat stat = this.countryDailyStatRepository.findByAppCodeAndStatDateAndCountry(appCode, today, code).orElseGet(() -> CountryDailyStat.builder().appCode(appCode).statDate(today).country(code).activeUsers(Long.valueOf(0L)).newUsers(Long.valueOf(0L)).build());
stat.setActiveUsers(Long.valueOf(stat.getActiveUsers() + 1L));
if (isNew) {
stat.setNewUsers(Long.valueOf(stat.getNewUsers() + 1L));
}
this.countryDailyStatRepository.save((Object)stat);
}
private void bumpShareCount(String appCode, String channel) {
LocalDate today = AdminStatsService.todayInChina();
ChannelDailyStat channelStat = this.channelDailyStatRepository.findByAppCodeAndStatDateAndChannel(appCode, today, channel).orElseGet(() -> ChannelDailyStat.builder().appCode(appCode).statDate(today).channel(channel).activeUsers(Long.valueOf(0L)).newUsers(Long.valueOf(0L)).shareCount(Long.valueOf(0L)).build());
channelStat.setShareCount(Long.valueOf(channelStat.getShareCount() + 1L));
this.channelDailyStatRepository.save((Object)channelStat);
}
private static String normalizeChannel(String channel) {
return AppChannelNames.normalize((String)channel);
}
private boolean isProdProfile() {
for (String profile : this.environment.getActiveProfiles()) {
if (!"prod".equalsIgnoreCase(profile)) continue;
return true;
}
return false;
}
public AppClientService(AppUserRepository appUserRepository, ClientLogRepository clientLogRepository, UserFeedbackRepository userFeedbackRepository, DailyActiveStatRepository dailyActiveStatRepository, ChannelDailyStatRepository channelDailyStatRepository, DauDedupService dauDedupService, PaymentRecordRepository paymentRecordRepository, UserShareEventRepository userShareEventRepository, CountryDailyStatRepository countryDailyStatRepository, CountryResolveService countryResolveService, BannerStateService bannerStateService, BannersConfigService bannersConfigService, VersionsConfigService versionsConfigService, PricesConfigService pricesConfigService, DeveloperAppsConfigService developerAppsConfigService, AdPlacementsConfigService adPlacementsConfigService, AppWhitelistConfigService appWhitelistConfigService, AppClientFeatureConfigService appClientFeatureConfigService, SparkUserOpsStore sparkUserOpsStore, OnlineDeviceTracker onlineDeviceTracker, Environment environment, DiscordFeedbackNotifier discordFeedbackNotifier, DefaultAvatarService defaultAvatarService) {
this.appUserRepository = appUserRepository;
this.clientLogRepository = clientLogRepository;
this.userFeedbackRepository = userFeedbackRepository;
this.dailyActiveStatRepository = dailyActiveStatRepository;
this.channelDailyStatRepository = channelDailyStatRepository;
this.dauDedupService = dauDedupService;
this.paymentRecordRepository = paymentRecordRepository;
this.userShareEventRepository = userShareEventRepository;
this.countryDailyStatRepository = countryDailyStatRepository;
this.countryResolveService = countryResolveService;
this.bannerStateService = bannerStateService;
this.bannersConfigService = bannersConfigService;
this.versionsConfigService = versionsConfigService;
this.pricesConfigService = pricesConfigService;
this.developerAppsConfigService = developerAppsConfigService;
this.adPlacementsConfigService = adPlacementsConfigService;
this.appWhitelistConfigService = appWhitelistConfigService;
this.appClientFeatureConfigService = appClientFeatureConfigService;
this.sparkUserOpsStore = sparkUserOpsStore;
this.onlineDeviceTracker = onlineDeviceTracker;
this.environment = environment;
this.discordFeedbackNotifier = discordFeedbackNotifier;
this.defaultAvatarService = defaultAvatarService;
}
}