|
|
@@ -1,343 +0,0 @@
|
|
|
-package com.adealink.weparty.roomtask.manager
|
|
|
-
|
|
|
-import com.adealink.frame.base.Rlt
|
|
|
-import com.adealink.frame.data.collections.ConcurrentList
|
|
|
-import com.adealink.frame.download.task.Task
|
|
|
-import com.adealink.frame.frame.BaseFrame
|
|
|
-import com.adealink.frame.log.Log
|
|
|
-import com.adealink.frame.network.ISocketNotify
|
|
|
-import com.adealink.frame.util.isFileExists
|
|
|
-import com.adealink.frame.util.md5
|
|
|
-import com.adealink.weparty.App
|
|
|
-import com.adealink.weparty.module.roomtask.data.AladdinBonusNotify
|
|
|
-import com.adealink.weparty.module.roomtask.data.AladdinInfo
|
|
|
-import com.adealink.weparty.module.roomtask.data.AladdinInfoData
|
|
|
-import com.adealink.weparty.module.roomtask.data.RoomTaskData
|
|
|
-import com.adealink.weparty.module.roomtask.data.RoomTaskFinishNotify
|
|
|
-import com.adealink.weparty.module.roomtask.data.TaskInfo
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager
|
|
|
-import com.adealink.weparty.module.roomtask.data.TaskInfo.Companion.TASK_STATUS_FINISH_ALREADY_TAKE_REWARD
|
|
|
-import com.adealink.weparty.module.roomtask.data.TaskInfo.Companion.TASK_STATUS_FINISH_NO_TAKE_REWARD
|
|
|
-import com.adealink.weparty.module.roomtask.data.TaskInfo.Companion.TASK_STATUS_IN_PROCESS
|
|
|
-import com.adealink.weparty.roomtask.datasource.RoomTaskHttpService
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager.Companion.ENTRANCE_NONE
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager.Companion.ENTRANCE_TYPE_ALADDIN_DAILY
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager.Companion.ENTRANCE_TYPE_ROOM
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager.Companion.TASK_TYPE_DIARY
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager.Companion.TASK_TYPE_NEW_USER
|
|
|
-import com.adealink.weparty.module.roomtask.manager.IRoomTaskManager.Companion.TASK_TYPE_UNKNOWN
|
|
|
-import com.adealink.weparty.module.roomtask.viewmodel.VapcEffectViewModel
|
|
|
-import kotlinx.coroutines.*
|
|
|
-import java.util.concurrent.ConcurrentHashMap
|
|
|
-
|
|
|
-val roomTaskManager: IRoomTaskManager by lazy { RoomTaskManager() }
|
|
|
-
|
|
|
-class RoomTaskManager : BaseFrame<IRoomTaskManager.IRoomTaskListener>(), IRoomTaskManager {
|
|
|
-
|
|
|
- private var taskEntranceMap = ConcurrentHashMap<Int, Boolean>()
|
|
|
-
|
|
|
- private var taskType = TASK_TYPE_UNKNOWN
|
|
|
- private var coinBonusCanTake: Long = 0
|
|
|
- private var coinBonusTotal: Long = 0
|
|
|
-
|
|
|
- private val roomTaskHttpService by lazy {
|
|
|
- App.instance.networkService.getHttpService(RoomTaskHttpService::class.java)
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 我的房间任务缓存
|
|
|
- * activityId + taskId -> TaskInfo
|
|
|
- */
|
|
|
- private val taskInfoListCache by lazy {
|
|
|
- ConcurrentList<TaskInfo>()
|
|
|
- }
|
|
|
-
|
|
|
- private val roomTaskFinishNotify = object : ISocketNotify<RoomTaskFinishNotify> {
|
|
|
-
|
|
|
- //任务领取奖励通知
|
|
|
- override val uri: String = "TASK_TAKE_REWARD"
|
|
|
-
|
|
|
- override fun needHandle(data: RoomTaskFinishNotify?): Boolean {
|
|
|
- return data != null
|
|
|
- }
|
|
|
-
|
|
|
- override fun onNotify(data: RoomTaskFinishNotify) {
|
|
|
- Log.d(TAG, "roomTaskFinishNotify, task(activityId:${data.activityId}, taskId:${data.taskId})")
|
|
|
- handleRoomFinishNotify(data)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private val aladdinAddCoinNotify = object : ISocketNotify<AladdinBonusNotify> {
|
|
|
-
|
|
|
- //任务领取奖励通知
|
|
|
- override val uri: String = "URI_USER_ADD_ALADDIN_BONUS_NOTIFY"
|
|
|
-
|
|
|
- override fun needHandle(data: AladdinBonusNotify?): Boolean {
|
|
|
- return data != null
|
|
|
- }
|
|
|
-
|
|
|
- override fun onNotify(data: AladdinBonusNotify) {
|
|
|
- Log.d(TAG, "aladdinAddCoinNotify, addCoin:${data.addValue}, coinCanTake:${data.currencyValue}")
|
|
|
- handleAladdinAddCoinNotify(data.currencyValue, data.addValue)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- init {
|
|
|
- App.instance.networkService.subscribeNotify(roomTaskFinishNotify)
|
|
|
- App.instance.networkService.subscribeNotify(aladdinAddCoinNotify)
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- private fun handleAladdinAddCoinNotify(currencyValue: Long, addCoin: Long) {
|
|
|
- Log.d(TAG, "handleAladdinAddCoinNotify: currencyValue:$currencyValue, addCoin:$addCoin")
|
|
|
- launch {
|
|
|
- coinBonusCanTake = currencyValue
|
|
|
- coinBonusTotal += addCoin
|
|
|
- notifyAladdinBonusChanged()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private fun handleRoomFinishNotify(notify: RoomTaskFinishNotify) {
|
|
|
- Log.d(TAG, "handleRoomFinishNotify: $notify")
|
|
|
- launch {
|
|
|
- refreshRoomTaskList()
|
|
|
- val taskInfo = getRoomTaskBy(notify.activityId, notify.taskId)
|
|
|
- if (taskInfo == null) {
|
|
|
- Log.w(
|
|
|
- TAG,
|
|
|
- "handleRoomFinishNotify return, for can not find TaskInfo from cache."
|
|
|
- )
|
|
|
- return@launch
|
|
|
- }
|
|
|
- notifyRoomTaskFinish(taskInfo)
|
|
|
-
|
|
|
- val notCompleteTask = taskInfoListCache
|
|
|
- .getCopyList()
|
|
|
- .find { it.getTaskStatus() != TASK_STATUS_FINISH_ALREADY_TAKE_REWARD }
|
|
|
- if (notCompleteTask == null) {
|
|
|
- notifyAllTaskComplete(taskType)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun prepareTaskInfo(queryTotalCoin: Boolean) {
|
|
|
- Log.d(TAG, "prepareTaskInfo")
|
|
|
-
|
|
|
- //1. 先获取任务入口
|
|
|
- val dailyTaskInfoRlt = roomTaskHttpService.getAladdinInfo(
|
|
|
- total = if (queryTotalCoin) {
|
|
|
- 1
|
|
|
- } else {
|
|
|
- 0
|
|
|
- }
|
|
|
- )
|
|
|
- if (dailyTaskInfoRlt is Rlt.Success) {
|
|
|
- val entranceMap = hashMapOf<Int, Boolean>()
|
|
|
- dailyTaskInfoRlt.data.data?.taskInfo?.let { map ->
|
|
|
- entranceMap[AladdinInfoData.TASK_ROOM] = map[AladdinInfoData.TASK_ROOM] == 1
|
|
|
- entranceMap[AladdinInfoData.TASK_ALADDIN] = map[AladdinInfoData.TASK_ALADDIN] == 1
|
|
|
- entranceMap[AladdinInfoData.TASK_DAILY] = map[AladdinInfoData.TASK_DAILY] == 1
|
|
|
- }
|
|
|
- taskEntranceMap.putAll(entranceMap)
|
|
|
-
|
|
|
- coinBonusCanTake = dailyTaskInfoRlt.data.data?.currencyValue ?: 0L
|
|
|
- coinBonusTotal = dailyTaskInfoRlt.data.data?.totalCurrencyValue ?: 0L
|
|
|
- } else {
|
|
|
- Log.e(TAG, "prepareTaskInfo fail, $dailyTaskInfoRlt")
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if (getTaskEntrance() == ENTRANCE_NONE) {
|
|
|
- //当前用户处于非正常用户,不能进行阿拉丁神灯,房间任务等玩法
|
|
|
- Log.w(TAG, "prepareTaskInfo return, for current user is invalid")
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- val newUserRoomTaskDef = coroutineScope { async { roomTaskHttpService.getDailyTaskInfo(RoomTaskData.ACTIVITY_CODE_NEW_USER_ROOM_TASK) } }
|
|
|
- val diaryRoomTaskDef = coroutineScope { async { roomTaskHttpService.getDailyTaskInfo(RoomTaskData.ACTIVITY_CODE_ROOM_DAILY_TASK) } }
|
|
|
- val newUserRoomTaskRlt = newUserRoomTaskDef.await()
|
|
|
- val diaryRoomTaskRlt = diaryRoomTaskDef.await()
|
|
|
-
|
|
|
- val newCacheList = mutableListOf<TaskInfo>()
|
|
|
- if (newUserRoomTaskRlt is Rlt.Success && diaryRoomTaskRlt is Rlt.Success) {
|
|
|
- val newUserTaskData = newUserRoomTaskRlt.data.data
|
|
|
- val diaryTaskData = diaryRoomTaskRlt.data.data
|
|
|
- if (newUserTaskData != null && newUserTaskData.dailyTaskItems.isNotEmpty()) {
|
|
|
- taskType = TASK_TYPE_NEW_USER
|
|
|
- for (taskItem in newUserTaskData.dailyTaskItems) {
|
|
|
- taskItem.activityId = newUserTaskData.activityId
|
|
|
- newCacheList.add(taskItem)
|
|
|
- }
|
|
|
- } else if (diaryTaskData != null && diaryTaskData.dailyTaskItems.isNotEmpty()) {
|
|
|
- taskType = TASK_TYPE_DIARY
|
|
|
- for (taskItem in diaryTaskData.dailyTaskItems) {
|
|
|
- taskItem.activityId = diaryTaskData.activityId
|
|
|
- newCacheList.add(taskItem)
|
|
|
- }
|
|
|
- } else {
|
|
|
- taskType = TASK_TYPE_UNKNOWN
|
|
|
- }
|
|
|
- taskInfoListCache.clearAndAddAll(newCacheList)
|
|
|
-
|
|
|
- downloadNecessaryResource()
|
|
|
- } else {
|
|
|
- Log.e(TAG, "prepareTaskInfo: fail, for getTaskInfo fail, newUserTaskRlt:${newUserRoomTaskRlt}, diaryTaskRlt:${diaryRoomTaskRlt}")
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private fun downloadNecessaryResource() {
|
|
|
- Log.d(TAG, "downloadNecessaryResource")
|
|
|
- launch {
|
|
|
- for (url in VAPC_EFFECT_LIST) {
|
|
|
- val savePath = VapcEffectViewModel.getSavePath(url)
|
|
|
- Log.d(TAG, "downloadNecessaryResource, path:$savePath")
|
|
|
- if (isFileExists(savePath)) {
|
|
|
- Log.d(TAG, "downloadNecessaryResource return, file exists")
|
|
|
- continue
|
|
|
- }
|
|
|
- val taskId = url.md5()
|
|
|
- val task = Task(taskId, url, savePath)
|
|
|
- App.instance.downloadService.addTask(task)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override fun getTaskEntrance(): Int {
|
|
|
- return if (taskEntranceMap[AladdinInfoData.TASK_ALADDIN] == true || taskEntranceMap[AladdinInfoData.TASK_DAILY] == true) {
|
|
|
- ENTRANCE_TYPE_ALADDIN_DAILY
|
|
|
- } else if (taskEntranceMap[AladdinInfoData.TASK_ROOM] == true) {
|
|
|
- ENTRANCE_TYPE_ROOM
|
|
|
- } else {
|
|
|
- ENTRANCE_NONE
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun refreshCoinBonus() {
|
|
|
- val dailyTaskInfoRlt = roomTaskHttpService.getAladdinInfo(1)
|
|
|
- if (dailyTaskInfoRlt is Rlt.Success) {
|
|
|
- coinBonusCanTake = dailyTaskInfoRlt.data.data?.currencyValue ?: 0L
|
|
|
- coinBonusTotal = dailyTaskInfoRlt.data.data?.totalCurrencyValue ?: 0L
|
|
|
- } else {
|
|
|
- coinBonusCanTake = 0L
|
|
|
- }
|
|
|
- notifyAladdinBonusChanged()
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun getAladdinInfo(): AladdinInfo {
|
|
|
- return AladdinInfo(coinBonusCanTake, coinBonusTotal, getAladdinStatus())
|
|
|
- }
|
|
|
-
|
|
|
- private fun getAladdinStatus(): Int {
|
|
|
- return if (coinBonusCanTake > 0) {
|
|
|
- //有金币待领取
|
|
|
- AladdinInfo.STATUS_COIN_BONUS_READY
|
|
|
- } else if (taskInfoListCache.getCopyList().find { it.getTaskStatus() == TASK_STATUS_FINISH_NO_TAKE_REWARD } != null) {
|
|
|
- //有任务奖励待领取
|
|
|
- AladdinInfo.STATUS_TASK_REWARD_READY
|
|
|
- } else {
|
|
|
- AladdinInfo.STATUS_IDLE
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun getCurrentTask(): TaskInfo? {
|
|
|
- val list = taskInfoListCache.getCopyList()
|
|
|
- return list.find {
|
|
|
- //1.奖励未领取
|
|
|
- it.getTaskStatus() == TASK_STATUS_FINISH_NO_TAKE_REWARD
|
|
|
- } ?: let {
|
|
|
- //2.任务未完成
|
|
|
- list.find {
|
|
|
- it.getTaskStatus() == TASK_STATUS_IN_PROCESS
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun getRoomTaskList(): List<TaskInfo> {
|
|
|
- return taskInfoListCache.getCopyList()
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun refreshRoomTaskList(): List<TaskInfo> {
|
|
|
- val newCacheList = mutableListOf<TaskInfo>()
|
|
|
- val newTaskType: Int
|
|
|
-
|
|
|
- val newUserRoomTaskDef = coroutineScope { async { roomTaskHttpService.getDailyTaskInfo(RoomTaskData.ACTIVITY_CODE_NEW_USER_ROOM_TASK) } }
|
|
|
- val diaryRoomTaskDef = coroutineScope { async { roomTaskHttpService.getDailyTaskInfo(RoomTaskData.ACTIVITY_CODE_ROOM_DAILY_TASK) } }
|
|
|
- val newUserRoomTaskRlt = newUserRoomTaskDef.await()
|
|
|
- val diaryRoomTaskRlt = diaryRoomTaskDef.await()
|
|
|
-
|
|
|
- if (newUserRoomTaskRlt is Rlt.Success && diaryRoomTaskRlt is Rlt.Success) {
|
|
|
- val newUserTaskData = newUserRoomTaskRlt.data.data
|
|
|
- val diaryTaskData = diaryRoomTaskRlt.data.data
|
|
|
- if (newUserTaskData != null && newUserTaskData.dailyTaskItems.isNotEmpty()) {
|
|
|
- newTaskType = TASK_TYPE_NEW_USER
|
|
|
- for (taskItem in newUserTaskData.dailyTaskItems) {
|
|
|
- taskItem.activityId = newUserTaskData.activityId
|
|
|
- newCacheList.add(taskItem)
|
|
|
- }
|
|
|
- } else if (diaryTaskData != null && diaryTaskData.dailyTaskItems.isNotEmpty()) {
|
|
|
- newTaskType = TASK_TYPE_DIARY
|
|
|
- for (taskItem in diaryTaskData.dailyTaskItems) {
|
|
|
- taskItem.activityId = diaryTaskData.activityId
|
|
|
- newCacheList.add(taskItem)
|
|
|
- }
|
|
|
- } else {
|
|
|
- newTaskType = TASK_TYPE_UNKNOWN
|
|
|
- }
|
|
|
-
|
|
|
- taskInfoListCache.clearAndAddAll(newCacheList)
|
|
|
- taskType = newTaskType
|
|
|
- } else {
|
|
|
- Log.e(TAG, "prepareTaskInfo: fail, for getTaskInfo fail, newUserTaskRlt:${newUserRoomTaskRlt}, diaryTaskRlt:${diaryRoomTaskRlt}")
|
|
|
- }
|
|
|
- return newCacheList
|
|
|
- }
|
|
|
-
|
|
|
- override suspend fun getRoomTaskBy(activityId: Long, taskId: Int): TaskInfo? {
|
|
|
- if (taskType == TASK_TYPE_UNKNOWN) {
|
|
|
- return null
|
|
|
- }
|
|
|
- return taskInfoListCache.getCopyList().find { it.activityId == activityId && it.taskId == taskId }
|
|
|
- }
|
|
|
-
|
|
|
- override fun getRoomTaskType(): Int {
|
|
|
- if (getTaskEntrance() == ENTRANCE_NONE) {
|
|
|
- return TASK_TYPE_UNKNOWN
|
|
|
- }
|
|
|
- return taskType
|
|
|
- }
|
|
|
-
|
|
|
- private fun notifyAladdinBonusChanged() {
|
|
|
- Log.d(TAG, "notifyAladdinBonusChanged, coinBonusCanTake:$coinBonusCanTake, coinBonusTotal:$coinBonusTotal")
|
|
|
- launch {
|
|
|
- val status = getAladdinStatus()
|
|
|
- dispatch {
|
|
|
- it.onCoinBonusChanged(coinBonusCanTake, coinBonusTotal, status)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private fun notifyRoomTaskFinish(taskInfo: TaskInfo) {
|
|
|
- Log.d(TAG, "notifyRoomTaskFinish, taskInfo:$taskInfo")
|
|
|
- dispatch {
|
|
|
- it.onTaskFinish(taskInfo)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private fun notifyAllTaskComplete(taskType: Int) {
|
|
|
- Log.d(TAG, "notifyAllTaskFinish")
|
|
|
- dispatch {
|
|
|
- it.onAllTaskComplete(taskType)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- companion object {
|
|
|
- const val TAG = "RoomTaskManager"
|
|
|
-
|
|
|
- val VAPC_EFFECT_LIST = listOf(
|
|
|
- App.instance.ossService.getUrlByPath("/room_task/aladdin/draw_lottery.mp4"), //待领取
|
|
|
- App.instance.ossService.getUrlByPath("/room_task/aladdin/unclaimed.mp4"), //开奖
|
|
|
- App.instance.ossService.getUrlByPath("/room_task/aladdin/coins.mp4"),
|
|
|
- App.instance.ossService.getUrlByPath("/room_task/aladdin/blow_up.mp4")
|
|
|
- )
|
|
|
- }
|
|
|
-}
|