DatabaseHelper.java 6.74 KB
Newer Older
Melledy's avatar
Melledy committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
package emu.grasscutter.database;

import java.util.List;

import com.mongodb.WriteResult;

import dev.morphia.query.FindOptions;
import dev.morphia.query.Query;
import dev.morphia.query.internal.MorphiaCursor;
import emu.grasscutter.GenshinConstants;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.GenshinPlayer;
import emu.grasscutter.game.avatar.GenshinAvatar;
import emu.grasscutter.game.friends.Friendship;
import emu.grasscutter.game.inventory.GenshinItem;

public class DatabaseHelper {
	
	protected static FindOptions FIND_ONE = new FindOptions().limit(1);
	
	public static Account createAccount(String username) {
		return createAccountWithId(username, 0);
	}
	
	public static Account createAccountWithId(String username, int reservedId) {
		// Unique names only
		Account exists = DatabaseHelper.getAccountByName(username);
		if (exists != null) {
			return null;
		}
		
		// Make sure there are no id collisions
		if (reservedId > 0) {
			// Cannot make account with the same uid as the server console
			if (reservedId == GenshinConstants.SERVER_CONSOLE_UID) {
				return null;
			}
			exists = DatabaseHelper.getAccountByPlayerId(reservedId);
			if (exists != null) {
				return null;
			}
		}

		// Account
		Account account = new Account();
		account.setUsername(username);
		account.setId(Integer.toString(DatabaseManager.getNextId(account)));
		
		if (reservedId > 0) {
			account.setPlayerId(reservedId);
		} 

		DatabaseHelper.saveAccount(account);
		return account;
	}

	@Deprecated
	public static Account createAccountWithPassword(String username, String password) {
		// Unique names only
		Account exists = DatabaseHelper.getAccountByName(username);
		if (exists != null) {
			return null;
		}
		
		// Account
		Account account = new Account();
		account.setId(Integer.toString(DatabaseManager.getNextId(account)));
		account.setUsername(username);
		account.setPassword(password);
        DatabaseHelper.saveAccount(account);
		return account;
	}

	public static void saveAccount(Account account) {
		DatabaseManager.getDatastore().save(account);
	}
	
	public static Account getAccountByName(String username) {
		MorphiaCursor<Account> cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username).find(FIND_ONE);
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static Account getAccountByToken(String token) {
		if (token == null) return null;
		MorphiaCursor<Account> cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("token").equal(token).find(FIND_ONE);
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static Account getAccountById(String uid) {
		MorphiaCursor<Account> cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("_id").equal(uid).find(FIND_ONE);
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	private static Account getAccountByPlayerId(int playerId) {
		MorphiaCursor<Account> cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("playerId").equal(playerId).find(FIND_ONE);
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static boolean deleteAccount(String username) {
		Query<Account> q = DatabaseManager.getDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username);
		return DatabaseManager.getDatastore().findAndDelete(q) != null;
	}
	
	public static GenshinPlayer getPlayerById(int id) {
		Query<GenshinPlayer> query = DatabaseManager.getDatastore().createQuery(GenshinPlayer.class).field("_id").equal(id);
		MorphiaCursor<GenshinPlayer> cursor = query.find(FIND_ONE);
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static boolean checkPlayerExists(int id) {
		MorphiaCursor<GenshinPlayer> query = DatabaseManager.getDatastore().createQuery(GenshinPlayer.class).field("_id").equal(id).find(FIND_ONE);
		return query.hasNext();
	}
	
	public static synchronized GenshinPlayer createPlayer(GenshinPlayer character, int reservedId) {
		// Check if reserved id
		int id = 0;
		if (reservedId > 0 && !checkPlayerExists(reservedId)) {
			id = reservedId;
			character.setId(id);
		} else {
			do {
				id = DatabaseManager.getNextId(character);
			}
			while (checkPlayerExists(id));
			character.setId(id);
		}
		// Save to database
		DatabaseManager.getDatastore().save(character);
		return character;
	}
	
	public static synchronized int getNextPlayerId(int reservedId) {
		// Check if reserved id
		int id = 0;
		if (reservedId > 0 && !checkPlayerExists(reservedId)) {
			id = reservedId;
		} else {
			do {
				id = DatabaseManager.getNextId(GenshinPlayer.class);
			}
			while (checkPlayerExists(id));
		}
		return id;
	}
	
	public static void savePlayer(GenshinPlayer character) {
		DatabaseManager.getDatastore().save(character);
	}
	
	public static void saveAvatar(GenshinAvatar avatar) {
		DatabaseManager.getDatastore().save(avatar);
	}
	
	public static List<GenshinAvatar> getAvatars(GenshinPlayer player) {
		Query<GenshinAvatar> query = DatabaseManager.getDatastore().createQuery(GenshinAvatar.class).filter("ownerId", player.getId());
		return query.find().toList();
	}
	
	public static void saveItem(GenshinItem item) {
		DatabaseManager.getDatastore().save(item);
	}
	
	public static boolean deleteItem(GenshinItem item) {
		WriteResult result = DatabaseManager.getDatastore().delete(item);
		return result.wasAcknowledged();
	}
	
	public static List<GenshinItem> getInventoryItems(GenshinPlayer player) {
		Query<GenshinItem> query = DatabaseManager.getDatastore().createQuery(GenshinItem.class).filter("ownerId", player.getId());
		return query.find().toList();
	}
	public static List<Friendship> getFriends(GenshinPlayer player) {
		Query<Friendship> query = DatabaseManager.getDatastore().createQuery(Friendship.class).filter("ownerId", player.getId());
		return query.find().toList();
	}
	
	public static List<Friendship> getReverseFriends(GenshinPlayer player) {
		Query<Friendship> query = DatabaseManager.getDatastore().createQuery(Friendship.class).filter("friendId", player.getId());
		return query.find().toList();
	}

	public static void saveFriendship(Friendship friendship) {
		DatabaseManager.getDatastore().save(friendship);
	}

	public static void deleteFriendship(Friendship friendship) {
		DatabaseManager.getDatastore().delete(friendship);
	}

	public static Friendship getReverseFriendship(Friendship friendship) {
		Query<Friendship> query = DatabaseManager.getDatastore().createQuery(Friendship.class);
		query.and(
			query.criteria("ownerId").equal(friendship.getFriendId()),
			query.criteria("friendId").equal(friendship.getOwnerId())
		);
		MorphiaCursor<Friendship> reverseFriendship = query.find(FIND_ONE);
		if (!reverseFriendship.hasNext()) return null;
		return reverseFriendship.next();
	}
}