X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryFriendDatabase.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryFriendDatabase.java;h=8df477a09f687ecd0287815f8529eec6210dc95c;hp=0be87389428b21f0774e7f7ca28f47bce0ab018f;hb=722b47810ffbe01465f104791c9f660ae161023b;hpb=0aa389b2493e19484530698e2ce056372dc2a1e9 diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java b/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java index 0be8738..8df477a 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java @@ -1,9 +1,12 @@ package net.pterodactylus.sone.database.memory; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.google.common.base.Optional; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -17,11 +20,40 @@ class MemoryFriendDatabase { private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final ConfigurationLoader configurationLoader; private final Multimap soneFriends = HashMultimap.create(); + private final Map soneFollowingTimes = new HashMap(); MemoryFriendDatabase(ConfigurationLoader configurationLoader) { this.configurationLoader = configurationLoader; } + void start() { + loadSoneFollowingTimes(); + } + + private void loadSoneFollowingTimes() { + Map soneFollowingTimes = configurationLoader.loadSoneFollowingTimes(); + lock.writeLock().lock(); + try { + this.soneFollowingTimes.clear(); + this.soneFollowingTimes.putAll(soneFollowingTimes); + } finally { + lock.writeLock().unlock(); + } + } + + void stop() { + saveSoneFollowingTimes(); + } + + private void saveSoneFollowingTimes() { + lock.readLock().lock(); + try { + configurationLoader.saveSoneFollowingTimes(soneFollowingTimes); + } finally { + lock.readLock().unlock(); + } + } + Collection getFriends(String localSoneId) { loadFriends(localSoneId); lock.readLock().lock(); @@ -32,6 +64,15 @@ class MemoryFriendDatabase { } } + Optional getSoneFollowingTime(String soneId) { + lock.readLock().lock(); + try { + return Optional.fromNullable(soneFollowingTimes.get(soneId)); + } finally { + lock.readLock().unlock(); + } + } + boolean isFriend(String localSoneId, String friendSoneId) { loadFriends(localSoneId); lock.readLock().lock(); @@ -46,6 +87,10 @@ class MemoryFriendDatabase { loadFriends(localSoneId); lock.writeLock().lock(); try { + if (!soneFollowingTimes.containsKey(friendSoneId)) { + soneFollowingTimes.put(friendSoneId, System.currentTimeMillis()); + saveSoneFollowingTimes(); + } if (soneFriends.put(localSoneId, friendSoneId)) { configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId)); } @@ -59,6 +104,10 @@ class MemoryFriendDatabase { lock.writeLock().lock(); try { if (soneFriends.remove(localSoneId, friendSoneId)) { + if (!soneFriends.containsValue(friendSoneId)) { + soneFollowingTimes.remove(friendSoneId); + saveSoneFollowingTimes(); + } configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId)); } } finally {