Fix world state API call

This commit is contained in:
Phillip Thelen 2018-02-09 16:31:21 +01:00
parent 52fe568d29
commit 0555a0d578
15 changed files with 129 additions and 123 deletions

View file

@ -357,6 +357,6 @@ public interface ApiService {
@POST("user/allocate-bulk")
Observable<HabitResponse<Stats>> bulkAllocatePoints(@Body Map<String, Map<String, Integer>> stats);
@POST("world-state")
@GET("world-state")
Observable<HabitResponse<WorldState>> getWorldState();
}

View file

@ -13,16 +13,17 @@ import rx.functions.Action1
internal abstract class ContentRepositoryImpl<T : ContentLocalRepository>(localRepository: T, apiClient: ApiClient) : BaseRepositoryImpl<T>(localRepository, apiClient), ContentRepository {
private var lastContentSync = Date()
private var lastWorldStateSync = Date()
private var lastContentSync = 0L
private var lastWorldStateSync = 0L
override fun retrieveContent(): Observable<ContentResult> {
return retrieveContent(false)
}
override fun retrieveContent(forced: Boolean): Observable<ContentResult> {
return if (forced || Date().time - this.lastContentSync.time > 3600000) {
lastContentSync = Date()
val now = Date().time
return if (forced || now - this.lastContentSync > 3600000) {
lastContentSync = now
apiClient.content.doOnNext({ localRepository.saveContent(it) })
} else {
Observable.just(null)
@ -30,8 +31,9 @@ internal abstract class ContentRepositoryImpl<T : ContentLocalRepository>(localR
}
override fun retrieveWorldState(): Observable<WorldState> {
return if (Date().time - this.lastWorldStateSync.time > 3600000) {
lastWorldStateSync = Date()
val now = Date().time
return if (now - this.lastWorldStateSync > 3600000) {
lastWorldStateSync = now
apiClient.worldState.doOnNext({ localRepository.saveWorldState(it) })
} else {
Observable.just(null)

View file

@ -12,6 +12,7 @@ import com.habitrpg.android.habitica.models.social.Challenge
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.user.User
import io.realm.Realm
import io.realm.RealmResults
import rx.Observable
import rx.functions.Action1

View file

@ -9,7 +9,6 @@ import com.habitrpg.android.habitica.models.Skill
import com.habitrpg.android.habitica.models.inventory.Customization
import com.habitrpg.android.habitica.models.inventory.CustomizationSet
import com.habitrpg.android.habitica.models.responses.SkillResponse
import com.habitrpg.android.habitica.models.responses.TaskScoringResult
import com.habitrpg.android.habitica.models.responses.UnlockResponse
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.tasks.Task

View file

@ -1,21 +0,0 @@
package com.habitrpg.android.habitica.data.local;
import java.util.List;
import io.realm.Realm;
import io.realm.RealmObject;
public interface BaseLocalRepository {
void close();
void executeTransaction(Realm.Transaction transaction);
<T extends RealmObject> T getUnmanagedCopy(T object);
<T extends RealmObject> List<T> getUnmanagedCopy(List<T> list);
<T extends RealmObject>void save(List<T> objects);
<T extends RealmObject>void save(T object);
boolean isClosed();
}

View file

@ -0,0 +1,20 @@
package com.habitrpg.android.habitica.data.local
import io.realm.Realm
import io.realm.RealmObject
interface BaseLocalRepository {
val isClosed: Boolean
fun close()
fun executeTransaction(transaction: () -> Unit)
fun executeTransaction(transaction: Realm.Transaction)
fun <T : RealmObject> getUnmanagedCopy(managedObject: T): T
fun <T : RealmObject> getUnmanagedCopy(list: List<T>): List<T>
fun <T : RealmObject> save(objects: List<T>)
fun <T : RealmObject> save(`object`: T)
}

View file

@ -1,56 +0,0 @@
package com.habitrpg.android.habitica.data.local.implementation;
import com.habitrpg.android.habitica.data.local.BaseLocalRepository;
import java.util.List;
import io.realm.Realm;
import io.realm.RealmObject;
public abstract class RealmBaseLocalRepository implements BaseLocalRepository {
Realm realm;
RealmBaseLocalRepository(Realm realm) {
this.realm = realm;
}
@Override
public void close() {
realm.close();
}
@Override
public void executeTransaction(Realm.Transaction transaction) {
realm.executeTransaction(transaction);
}
@Override
public <T extends RealmObject> T getUnmanagedCopy(T object) {
if (object.isManaged() && object.isValid()) {
return realm.copyFromRealm(object);
} else {
return object;
}
}
@Override
public <T extends RealmObject> List<T> getUnmanagedCopy(List<T> list) {
return realm.copyFromRealm(list);
}
@Override
public <T extends RealmObject> void save(T object) {
realm.executeTransactionAsync(realm1 -> realm1.insertOrUpdate(object));
}
@Override
public boolean isClosed() {
return realm.isClosed();
}
@Override
public <T extends RealmObject> void save(List<T> objects) {
realm.executeTransactionAsync(realm1 -> realm1.insertOrUpdate(objects));
}
}

View file

@ -0,0 +1,46 @@
package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.BaseLocalRepository
import io.realm.Realm
import io.realm.RealmObject
abstract class RealmBaseLocalRepository internal constructor(protected var realm: Realm) : BaseLocalRepository {
override val isClosed: Boolean
get() = realm.isClosed
override fun close() {
realm.close()
}
override fun executeTransaction(transaction: () -> Unit) {
realm.executeTransaction {
transaction()
}
}
override fun executeTransaction(transaction: Realm.Transaction) {
realm.executeTransaction(transaction)
}
override fun <T : RealmObject> getUnmanagedCopy(managedObject: T): T {
return if (managedObject.isManaged && managedObject.isValid) {
realm.copyFromRealm(managedObject)
} else {
managedObject
}
}
override fun <T : RealmObject> getUnmanagedCopy(list: List<T>): List<T> {
return realm.copyFromRealm(list)
}
override fun <T : RealmObject> save(`object`: T) {
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(`object`) }
}
override fun <T : RealmObject> save(objects: List<T>) {
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) }
}
}

View file

@ -21,7 +21,7 @@ public class RealmChallengeLocalRepository extends RealmBaseLocalRepository impl
@Override
public Observable<Challenge> getChallenge(String id) {
return realm.where(Challenge.class)
return getRealm().where(Challenge.class)
.equalTo("id", id)
.findFirstAsync()
.asObservable()
@ -36,7 +36,7 @@ public class RealmChallengeLocalRepository extends RealmBaseLocalRepository impl
@Override
public Observable<RealmResults<Challenge>> getChallenges() {
return realm.where(Challenge.class)
return getRealm().where(Challenge.class)
.isNotNull("name")
.findAllSortedAsync("official", Sort.DESCENDING, "createdAt", Sort.DESCENDING)
.asObservable()
@ -45,7 +45,7 @@ public class RealmChallengeLocalRepository extends RealmBaseLocalRepository impl
@Override
public Observable<RealmResults<Challenge>> getUserChallenges(String userId) {
return realm.where(Challenge.class)
return getRealm().where(Challenge.class)
.isNotNull("name")
.equalTo("isParticipating", true)
.findAllSortedAsync("official", Sort.DESCENDING, "createdAt", Sort.DESCENDING)
@ -55,23 +55,23 @@ public class RealmChallengeLocalRepository extends RealmBaseLocalRepository impl
@Override
public void setParticipating(Challenge challenge, boolean isParticipating) {
realm.executeTransaction(realm1 -> challenge.isParticipating = isParticipating);
getRealm().executeTransaction(realm1 -> challenge.isParticipating = isParticipating);
}
@Override
public void saveChallenges(List<Challenge> onlineChallenges) {
OrderedRealmCollectionSnapshot<Challenge> localChallenges = realm.where(Challenge.class).findAll().createSnapshot();
OrderedRealmCollectionSnapshot<Challenge> localChallenges = getRealm().where(Challenge.class).findAll().createSnapshot();
List<Challenge> challengesToDelete = new ArrayList<>();
for (Challenge localTask : localChallenges) {
if (!onlineChallenges.contains(localTask)) {
challengesToDelete.add(localTask);
}
}
realm.executeTransaction(realm1 -> {
getRealm().executeTransaction(realm1 -> {
for (Challenge localTask : challengesToDelete) {
localTask.deleteFromRealm();
}
});
realm.executeTransaction(realm1 -> realm1.insertOrUpdate(onlineChallenges));
getRealm().executeTransaction(realm1 -> realm1.insertOrUpdate(onlineChallenges));
}
}

View file

@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.ContentLocalRepository
import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.social.Group
import io.realm.Realm
@ -32,10 +33,15 @@ internal open class RealmContentLocalRepository(realm: Realm) : RealmBaseLocalRe
}
override fun saveWorldState(worldState: WorldState) {
val tavern = realm.where(Group::class.java)
val tavern = getUnmanagedCopy(realm.where(Group::class.java)
.equalTo("id", Group.TAVERN_ID)
.findFirst() ?: Group()
tavern.id = Group.TAVERN_ID
.findFirst() ?: Group())
if (!tavern.isManaged) {
tavern.id = Group.TAVERN_ID
}
if (tavern.quest == null) {
tavern.quest = Quest()
}
tavern.quest?.active = worldState.worldBossActive
tavern.quest?.key = worldState.worldBossKey
tavern.quest?.progress = worldState.progress

View file

@ -19,7 +19,7 @@ public class RealmCustomizationLocalRepository extends RealmContentLocalReposito
@Override
public Observable<RealmResults<Customization>> getCustomizations(String type, String category, boolean onlyAvailable) {
RealmQuery<Customization> query = realm.where(Customization.class)
RealmQuery<Customization> query = getRealm().where(Customization.class)
.equalTo("type", type)
.equalTo("category", category);
if (onlyAvailable) {

View file

@ -15,7 +15,7 @@ public class RealmFAQLocalRepository extends RealmContentLocalRepository impleme
@Override
public Observable<RealmResults<FAQArticle>> getArticles() {
return realm.where(FAQArticle.class)
return getRealm().where(FAQArticle.class)
.findAll()
.asObservable()
.filter(RealmResults::isLoaded);

View file

@ -40,7 +40,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<QuestContent> getQuestContent(String key) {
return realm.where(QuestContent.class).equalTo("key", key).findFirstAsync()
return getRealm().where(QuestContent.class).equalTo("key", key).findFirstAsync()
.asObservable()
.filter(realmObject -> realmObject.isLoaded())
.cast(QuestContent.class);
@ -48,7 +48,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Equipment>> getEquipment(List<String> searchedKeys) {
return realm.where(Equipment.class)
return getRealm().where(Equipment.class)
.in("key", searchedKeys.toArray(new String[0]))
.findAll()
.asObservable()
@ -57,7 +57,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public long getArmoireRemainingCount() {
return realm.where(Equipment.class)
return getRealm().where(Equipment.class)
.equalTo("klass", "armoire")
.beginGroup()
.equalTo("owned", false)
@ -69,7 +69,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Equipment>> getOwnedEquipment(String type) {
return realm.where(Equipment.class)
return getRealm().where(Equipment.class)
.equalTo("type", type)
.equalTo("owned", true)
.findAll()
@ -79,7 +79,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Equipment>> getOwnedEquipment() {
return realm.where(Equipment.class)
return getRealm().where(Equipment.class)
.equalTo("owned", true)
.findAll()
.asObservable()
@ -92,7 +92,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
return Observable.empty();
}
RealmQuery<? extends Item> query = realm.where(itemClass);
RealmQuery<? extends Item> query = getRealm().where(itemClass);
if (SpecialItem.class.isAssignableFrom(itemClass)) {
if (user != null && user.getPurchased() != null && user.getPurchased().getPlan() != null) {
SpecialItem mysticItem;
@ -138,7 +138,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<Equipment> getEquipment(String key) {
return realm.where(Equipment.class)
return getRealm().where(Equipment.class)
.equalTo("key", key)
.findFirstAsync()
.asObservable()
@ -148,7 +148,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Mount>> getMounts() {
return realm.where(Mount.class)
return getRealm().where(Mount.class)
.findAllSorted("animalGroup", Sort.ASCENDING, "animal", Sort.ASCENDING)
.asObservable()
.filter(RealmResults::isLoaded);
@ -156,7 +156,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Mount>> getMounts(String type, String group) {
return realm.where(Mount.class)
return getRealm().where(Mount.class)
.equalTo("animalGroup", group)
.equalTo("animal", type)
.findAll()
@ -166,7 +166,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Mount>> getOwnedMounts() {
return realm.where(Mount.class)
return getRealm().where(Mount.class)
.equalTo("owned", true)
.findAllSorted("animalGroup", Sort.ASCENDING, "animal", Sort.ASCENDING)
.asObservable()
@ -179,7 +179,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
animalGroup = "";
}
animalGroup = animalGroup.replace("pets", "mounts").replace("Pets", "Mounts");
return realm.where(Mount.class)
return getRealm().where(Mount.class)
.equalTo("animalGroup", animalGroup)
.equalTo("animal", animalType)
.equalTo("owned", true)
@ -190,7 +190,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Pet>> getPets() {
return realm.where(Pet.class)
return getRealm().where(Pet.class)
.findAllSorted("animalGroup", Sort.ASCENDING, "animal", Sort.ASCENDING)
.asObservable()
.filter(RealmResults::isLoaded);
@ -198,7 +198,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Pet>> getPets(String type, String group) {
return realm.where(Pet.class)
return getRealm().where(Pet.class)
.equalTo("animalGroup", group)
.equalTo("animal", type)
.findAll()
@ -208,7 +208,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Pet>> getOwnedPets() {
return realm.where(Pet.class)
return getRealm().where(Pet.class)
.greaterThan("trained", 0)
.findAllSorted("animalGroup", Sort.ASCENDING, "animal", Sort.ASCENDING)
.asObservable()
@ -217,7 +217,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<Pet>> getOwnedPets(String type, String group) {
return realm.where(Pet.class)
return getRealm().where(Pet.class)
.equalTo("animalGroup", group)
.equalTo("animal", type)
.greaterThan("trained", 0)
@ -238,7 +238,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public void changeOwnedCount(Item item, Integer amountToAdd) {
realm.executeTransaction(realm1 -> item.setOwned(item.getOwned()+amountToAdd));
getRealm().executeTransaction(realm1 -> item.setOwned(item.getOwned()+amountToAdd));
}
@Override
@ -257,15 +257,15 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
case "quests":
itemClass = QuestContent.class;
}
return realm.where(itemClass).equalTo("key", key).findFirstAsync().asObservable()
return getRealm().where(itemClass).equalTo("key", key).findFirstAsync().asObservable()
.filter(realmObject -> realmObject.isLoaded())
.cast(Item.class);
}
@Override
public void decrementMysteryItemCount(User user) {
SpecialItem item = realm.where(SpecialItem.class).equalTo("isMysteryItem", true).findFirst();
realm.executeTransaction(realm1 -> {
SpecialItem item = getRealm().where(SpecialItem.class).equalTo("isMysteryItem", true).findFirst();
getRealm().executeTransaction(realm1 -> {
if (item != null && item.isValid()) {
item.setOwned(item.getOwned() - 1);
}
@ -277,7 +277,7 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public Observable<RealmResults<ShopItem>> getInAppRewards() {
return realm.where(ShopItem.class)
return getRealm().where(ShopItem.class)
.findAllAsync()
.asObservable()
.filter(RealmResults::isLoaded);
@ -285,14 +285,14 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i
@Override
public void saveInAppRewards(List<ShopItem> onlineItems) {
OrderedRealmCollectionSnapshot<ShopItem> localItems = realm.where(ShopItem.class).findAll().createSnapshot();
realm.executeTransaction(realm1 -> {
OrderedRealmCollectionSnapshot<ShopItem> localItems = getRealm().where(ShopItem.class).findAll().createSnapshot();
getRealm().executeTransaction(realm1 -> {
for (ShopItem localItem : localItems) {
if (!onlineItems.contains(localItem)) {
localItem.deleteFromRealm();
}
}
realm.insertOrUpdate(onlineItems);
getRealm().insertOrUpdate(onlineItems);
});
}

View file

@ -18,12 +18,12 @@ public class RealmTagLocalRepository extends RealmBaseLocalRepository implements
@Override
public Observable<RealmResults<Tag>> getTags(String userId) {
return realm.where(Tag.class).equalTo("userId", userId).findAll().asObservable();
return getRealm().where(Tag.class).equalTo("userId", userId).findAll().asObservable();
}
@Override
public void removeOldTags(List<Tag> onlineTags, String userID) {
OrderedRealmCollectionSnapshot<Tag> localTags = realm.where(Tag.class).equalTo("userId", userID).findAll().createSnapshot();
OrderedRealmCollectionSnapshot<Tag> localTags = getRealm().where(Tag.class).equalTo("userId", userID).findAll().createSnapshot();
for (Tag localTag : localTags) {
if (!onlineTags.contains(localTag)) {
localTag.deleteFromRealm();

View file

@ -18,7 +18,16 @@ class WorldStateSerialization: JsonDeserializer<WorldState> {
}
state.worldBossActive = worldBossObject["active"].asBoolean
state.worldBossKey = worldBossObject["key"].asString
state.progress = context?.deserialize(worldBossObject["progress"], QuestProgress::class.java)
if (worldBossObject.has("progress")) {
val progress = QuestProgress()
val progressObj = worldBossObject.getAsJsonObject("progress")
if (progressObj.has("hp")) {
progress.hp = progressObj["hp"].asDouble
}
if (progressObj.has("rage")) {
progress.rage = progressObj["rage"].asDouble
}
}
if (worldBossObject.has("extra")) {
val extra = worldBossObject["extra"].asJsonObject
if (extra.has("worldDmg")) {