DatabaseHelper.java 6.79 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
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;
			}
Melledy's avatar
Melledy committed
39
			
Melledy's avatar
Melledy committed
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
			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) {
77
		DatabaseManager.getAccountDatastore().save(account);
Melledy's avatar
Melledy committed
78
79
80
	}
	
	public static Account getAccountByName(String username) {
81
		MorphiaCursor<Account> cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username).find(FIND_ONE);
Melledy's avatar
Melledy committed
82
83
84
85
86
87
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static Account getAccountByToken(String token) {
		if (token == null) return null;
88
		MorphiaCursor<Account> cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("token").equal(token).find(FIND_ONE);
Melledy's avatar
Melledy committed
89
90
91
92
93
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static Account getAccountById(String uid) {
94
		MorphiaCursor<Account> cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("_id").equal(uid).find(FIND_ONE);
Melledy's avatar
Melledy committed
95
96
97
98
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
99
	public static Account getAccountByPlayerId(int playerId) {
100
		MorphiaCursor<Account> cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("playerId").equal(playerId).find(FIND_ONE);
Melledy's avatar
Melledy committed
101
102
103
104
105
		if (!cursor.hasNext()) return null;
		return cursor.next();
	}
	
	public static boolean deleteAccount(String username) {
106
		Query<Account> q = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username);
Melledy's avatar
Melledy committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
		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;
127
			character.setUid(id);
Melledy's avatar
Melledy committed
128
129
130
131
132
		} else {
			do {
				id = DatabaseManager.getNextId(character);
			}
			while (checkPlayerExists(id));
133
			character.setUid(id);
Melledy's avatar
Melledy committed
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
		}
		// 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) {
163
		Query<GenshinAvatar> query = DatabaseManager.getDatastore().createQuery(GenshinAvatar.class).filter("ownerId", player.getUid());
Melledy's avatar
Melledy committed
164
165
166
167
168
169
170
171
172
173
174
175
176
		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) {
177
		Query<GenshinItem> query = DatabaseManager.getDatastore().createQuery(GenshinItem.class).filter("ownerId", player.getUid());
Melledy's avatar
Melledy committed
178
179
180
		return query.find().toList();
	}
	public static List<Friendship> getFriends(GenshinPlayer player) {
181
		Query<Friendship> query = DatabaseManager.getDatastore().createQuery(Friendship.class).filter("ownerId", player.getUid());
Melledy's avatar
Melledy committed
182
183
184
185
		return query.find().toList();
	}
	
	public static List<Friendship> getReverseFriends(GenshinPlayer player) {
186
		Query<Friendship> query = DatabaseManager.getDatastore().createQuery(Friendship.class).filter("friendId", player.getUid());
Melledy's avatar
Melledy committed
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
		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();
	}
}