Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ziqian zhang
Grasscutter
Commits
19e798a2
Commit
19e798a2
authored
May 09, 2022
by
ImmuState
Committed by
Melledy
May 09, 2022
Browse files
Change ccount delete to delete all referenced items in the database.
parent
85f5a753
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/command/commands/AccountCommand.java
View file @
19e798a2
package
emu.grasscutter.command.commands
;
package
emu.grasscutter.command.commands
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.command.Command
;
import
emu.grasscutter.command.Command
;
import
emu.grasscutter.command.CommandHandler
;
import
emu.grasscutter.command.CommandHandler
;
import
emu.grasscutter.database.DatabaseHelper
;
import
emu.grasscutter.database.DatabaseHelper
;
import
emu.grasscutter.game.Account
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.player.Player
;
import
java.util.List
;
import
java.util.List
;
...
@@ -54,11 +56,24 @@ public final class AccountCommand implements CommandHandler {
...
@@ -54,11 +56,24 @@ public final class AccountCommand implements CommandHandler {
}
}
return
;
return
;
case
"delete"
:
case
"delete"
:
if
(
DatabaseHelper
.
deleteAccount
(
username
))
{
// Get the account we want to delete.
CommandHandler
.
sendMessage
(
null
,
translate
(
"commands.account.delete"
));
Account
toDelete
=
DatabaseHelper
.
getAccountByName
(
username
);
}
else
{
if
(
toDelete
==
null
)
{
CommandHandler
.
sendMessage
(
null
,
translate
(
"commands.account.no_account"
));
CommandHandler
.
sendMessage
(
null
,
translate
(
"commands.account.no_account"
));
return
;
}
}
// Get the player for the account.
// If that player is currently online, we kick them before proceeding with the deletion.
Player
player
=
Grasscutter
.
getGameServer
().
getPlayerByUid
(
toDelete
.
getPlayerUid
());
if
(
player
!=
null
)
{
player
.
getSession
().
close
();
}
// Finally, we do the actual deletion.
DatabaseHelper
.
deleteAccount
(
toDelete
);
CommandHandler
.
sendMessage
(
null
,
translate
(
"commands.account.delete"
));
}
}
}
}
}
}
src/main/java/emu/grasscutter/database/DatabaseHelper.java
View file @
19e798a2
...
@@ -3,6 +3,8 @@ package emu.grasscutter.database;
...
@@ -3,6 +3,8 @@ package emu.grasscutter.database;
import
java.util.List
;
import
java.util.List
;
import
com.mongodb.client.result.DeleteResult
;
import
com.mongodb.client.result.DeleteResult
;
import
dev.morphia.experimental.MorphiaSession
;
import
dev.morphia.query.FindOptions
;
import
dev.morphia.query.FindOptions
;
import
dev.morphia.query.Sort
;
import
dev.morphia.query.Sort
;
import
dev.morphia.query.experimental.filters.Filters
;
import
dev.morphia.query.experimental.filters.Filters
;
...
@@ -95,8 +97,31 @@ public final class DatabaseHelper {
...
@@ -95,8 +97,31 @@ public final class DatabaseHelper {
return
DatabaseManager
.
getDatastore
().
find
(
Account
.
class
).
filter
(
Filters
.
eq
(
"playerId"
,
playerId
)).
first
();
return
DatabaseManager
.
getDatastore
().
find
(
Account
.
class
).
filter
(
Filters
.
eq
(
"playerId"
,
playerId
)).
first
();
}
}
public
static
boolean
deleteAccount
(
String
username
)
{
//public static boolean deleteAccount(String username) {
return
DatabaseManager
.
getDatastore
().
find
(
Account
.
class
).
filter
(
Filters
.
eq
(
"username"
,
username
)).
delete
().
getDeletedCount
()
>
0
;
// return DatabaseManager.getDatastore().find(Account.class).filter(Filters.eq("username", username)).delete().getDeletedCount() > 0;
//}
public
static
void
deleteAccount
(
Account
target
)
{
// To delete an account, we need to also delete all the other documents in the database that reference the account.
// This should optimally be wrapped inside a transaction, to make sure an error thrown mid-way does not leave the
// database in an inconsistent state, but unfortunately Mongo only supports that when we have a replica set ...
// Delete mails, gacha records, items and avatars.
DatabaseManager
.
getDatastore
().
find
(
Mail
.
class
).
filter
(
Filters
.
eq
(
"ownerUid"
,
target
.
getPlayerUid
())).
delete
();
DatabaseManager
.
getDatastore
().
find
(
GachaRecord
.
class
).
filter
(
Filters
.
eq
(
"ownerId"
,
target
.
getPlayerUid
())).
delete
();
DatabaseManager
.
getDatastore
().
find
(
GameItem
.
class
).
filter
(
Filters
.
eq
(
"ownerId"
,
target
.
getPlayerUid
())).
delete
();
DatabaseManager
.
getDatastore
().
find
(
Avatar
.
class
).
filter
(
Filters
.
eq
(
"ownerId"
,
target
.
getPlayerUid
())).
delete
();
// Delete friendships.
// Here, we need to make sure to not only delete the deleted account's friendships,
// but also all friendship entries for that account's friends.
DatabaseManager
.
getDatastore
().
find
(
Friendship
.
class
).
filter
(
Filters
.
eq
(
"ownerId"
,
target
.
getPlayerUid
())).
delete
();
DatabaseManager
.
getDatastore
().
find
(
Friendship
.
class
).
filter
(
Filters
.
eq
(
"friendId"
,
target
.
getPlayerUid
())).
delete
();
// Delete the player.
DatabaseManager
.
getDatastore
().
find
(
Player
.
class
).
filter
(
Filters
.
eq
(
"id"
,
target
.
getPlayerUid
())).
delete
();
// Finally, delete the account itself.
DatabaseManager
.
getDatastore
().
find
(
Account
.
class
).
filter
(
Filters
.
eq
(
"id"
,
target
.
getId
())).
delete
();
}
}
public
static
List
<
Player
>
getAllPlayers
()
{
public
static
List
<
Player
>
getAllPlayers
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment