Hello, MyBatis!
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package ru.prisonlife.api.template;
|
||||
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import ru.prisonlife.api.PrisonAPI;
|
||||
import ru.prisonlife.api.store.PlayerStatsDao;
|
||||
import ru.prisonlife.api.store.PlayerStatsEntity;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
@@ -20,10 +20,14 @@ public abstract class AbstractApiData {
|
||||
if (refPlayerStatsEntity != null && (entity = refPlayerStatsEntity.get()) != null) {
|
||||
return entity;
|
||||
} else {
|
||||
final PlayerStatsDao playerStatsDao = PrisonAPI.getPlayerStatsDao();
|
||||
entity = playerStatsDao.findByUuid(me.getPlayer().getUniqueId())
|
||||
.orElseThrow(() -> new RuntimeException(
|
||||
"no data in db by '" + me.getPlayer().getUniqueId().toString() + "'"));
|
||||
final SqlSession session = PrisonAPI.getSqlStore().openSession();
|
||||
entity = session.selectOne("PlayerStats.selectOne", me.getPlayer().getUniqueId().toString());
|
||||
session.close();
|
||||
|
||||
if (entity == null) {
|
||||
throw new RuntimeException("no data in db by '" + me.getPlayer().getUniqueId().toString() + "'");
|
||||
}
|
||||
|
||||
refPlayerStatsEntity = new WeakReference<>(entity);
|
||||
return entity;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package ru.prisonlife.api.template;
|
||||
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.bukkit.Bukkit;
|
||||
import ru.prisonlife.api.PrisonAPI;
|
||||
import ru.prisonlife.api.PrisonAPI.Factions;
|
||||
import ru.prisonlife.api.store.AbstractCachedDao;
|
||||
import ru.prisonlife.api.store.DailyRespectTaskEntity;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
@@ -28,21 +28,25 @@ public class Faction extends AbstractApiData {
|
||||
if (refDailyRespectTaskEntity != null && (entity = refDailyRespectTaskEntity.get()) != null) {
|
||||
return entity;
|
||||
} else {
|
||||
final AbstractCachedDao<DailyRespectTaskEntity> cachedDao = PrisonAPI.getDailyRespectTaskDao();
|
||||
entity = cachedDao.findByUuid(me.getPlayer().getUniqueId())
|
||||
.orElseThrow(() -> new RuntimeException(
|
||||
"no data in db by '" + me.getPlayer().getUniqueId().toString() + "'"));
|
||||
final SqlSession session = PrisonAPI.getSqlStore().openSession();
|
||||
entity = session.selectOne("DailyRespectTask.selectOne", me.getPlayer().getUniqueId().toString());
|
||||
session.close();
|
||||
|
||||
if (entity == null) {
|
||||
throw new RuntimeException("no data in db by '" + me.getPlayer().getUniqueId().toString() + "'");
|
||||
}
|
||||
|
||||
refDailyRespectTaskEntity = new WeakReference<>(entity);
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return getPlayerStatsEntity().getFaction().name();
|
||||
return Factions.valueOf(getPlayerStatsEntity().getFaction()).name();
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return getPlayerStatsEntity().getFaction().getId();
|
||||
return getPlayerStatsEntity().getFaction();
|
||||
}
|
||||
|
||||
public int getRangId() {
|
||||
@@ -62,7 +66,7 @@ public class Faction extends AbstractApiData {
|
||||
}
|
||||
|
||||
public void setFaction(int id) {
|
||||
getPlayerStatsEntity().setFaction(Factions.valueOf(id));
|
||||
getPlayerStatsEntity().setFaction(id);
|
||||
}
|
||||
|
||||
public int getRespect() {
|
||||
|
||||
@@ -2,6 +2,7 @@ package ru.prisonlife.api.template;
|
||||
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
@@ -19,6 +20,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import static ru.prisonlife.api.PrisonAPI.getSqlStore;
|
||||
|
||||
public class Policeman extends Prisoner {
|
||||
|
||||
private Map<Prisoner, BukkitRunnable> timeInCage = new HashMap<>();
|
||||
@@ -28,77 +31,79 @@ public class Policeman extends Prisoner {
|
||||
}
|
||||
|
||||
public void arrestPrisoner(Prisoner prs) throws SQLException {
|
||||
final Connection connection = PrisonAPI.getSqlStore().getConnection();
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
final Connection connection = session.getConnection();
|
||||
|
||||
if(prs.getPlayer().isOnline()) {
|
||||
Manager mng = new Manager(super.getPrison());
|
||||
List<String> all_cages = mng.getCages();
|
||||
PreparedStatement st = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?");
|
||||
st.setString(1, me.getUniqueId().toString());
|
||||
try(ResultSet resultSet = st.executeQuery()) {
|
||||
if(!resultSet.next()) {
|
||||
int su = prs.getSuspect();
|
||||
st.close();
|
||||
st = connection.prepareStatement(
|
||||
"INSERT INTO players_in_cages(NAME, UUID, TIME_IN_CAGE, BLOCKS_LEFT) " +
|
||||
"VALUES (?, ?, ?, ?)");
|
||||
st.setString(1, getPlayer().getName());
|
||||
st.setString(2, me.getUniqueId().toString());
|
||||
st.setInt(3, (su * 6));
|
||||
st.setInt(4, (su * 100));
|
||||
st.executeUpdate();
|
||||
}
|
||||
}
|
||||
st.close();
|
||||
prs.setSuspect(0);
|
||||
mng.teleportInToCage(prs, all_cages.get(new Random().nextInt(all_cages.size())));
|
||||
FileConfiguration configurationSuspect = YamlConfiguration.loadConfiguration(new File("plugins/PrisonSuspect/", "parameters.yml"));
|
||||
String actionMessage = ChatColor.translateAlternateColorCodes('&',
|
||||
configurationSuspect.getString("MESSAGES.ACTION_BAR_PROGRESS"));
|
||||
BukkitRunnable actionBar = new BukkitRunnable() {//"MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE"
|
||||
@Override
|
||||
public void run() {
|
||||
prs.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(actionMessage));
|
||||
}
|
||||
};
|
||||
timeInCage.put(prs, new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() { // Future = Пометить, что когда in Cage и вышел, то удалить поток, а если зашёл и in Cage - запустить ~ Optimize
|
||||
try {
|
||||
int time = 0;
|
||||
String uuid = prs.getPlayer().getUniqueId().toString();
|
||||
PreparedStatement st = connection.prepareStatement(
|
||||
"SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?");
|
||||
st.setString(1, uuid);
|
||||
try(ResultSet resultSet = st.executeQuery()) {
|
||||
if(resultSet.next())
|
||||
time = resultSet.getInt(1);
|
||||
}
|
||||
if(time == 0) {
|
||||
prs.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&',
|
||||
configurationSuspect.getString("MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE")));
|
||||
actionBar.cancel();
|
||||
cancel();
|
||||
timeInCage.remove(prs);
|
||||
st = connection.prepareStatement("DELETE FROM players_in_cages WHERE UUID = ?");
|
||||
st.setString(1, uuid);
|
||||
st.execute();
|
||||
} else {
|
||||
if(prs.getPlayer().isOnline()) {
|
||||
st = connection.prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = " + (time - 1) + " WHERE UUID = ?");
|
||||
st.setString(1, uuid);
|
||||
st.execute();
|
||||
}
|
||||
}
|
||||
if (prs.getPlayer().isOnline()) {
|
||||
Manager mng = new Manager(super.getPrison());
|
||||
List<String> all_cages = mng.getCages();
|
||||
PreparedStatement st = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?");
|
||||
st.setString(1, me.getUniqueId().toString());
|
||||
try (ResultSet resultSet = st.executeQuery()) {
|
||||
if (!resultSet.next()) {
|
||||
int su = prs.getSuspect();
|
||||
st.close();
|
||||
} catch(SQLException e) {
|
||||
e.printStackTrace();
|
||||
st = connection.prepareStatement(
|
||||
"INSERT INTO players_in_cages(NAME, UUID, TIME_IN_CAGE, BLOCKS_LEFT) " +
|
||||
"VALUES (?, ?, ?, ?)");
|
||||
st.setString(1, getPlayer().getName());
|
||||
st.setString(2, me.getUniqueId().toString());
|
||||
st.setInt(3, (su * 6));
|
||||
st.setInt(4, (su * 100));
|
||||
st.executeUpdate();
|
||||
}
|
||||
}
|
||||
});
|
||||
int m = 20 * 60;
|
||||
actionBar.runTaskTimer(PrisonAPI.plugin, 5, 5);
|
||||
timeInCage.get(prs).runTaskTimer(PrisonAPI.plugin, m, m);
|
||||
st.close();
|
||||
prs.setSuspect(0);
|
||||
mng.teleportInToCage(prs, all_cages.get(new Random().nextInt(all_cages.size())));
|
||||
FileConfiguration configurationSuspect = YamlConfiguration.loadConfiguration(new File("plugins/PrisonSuspect/", "parameters.yml"));
|
||||
String actionMessage = ChatColor.translateAlternateColorCodes('&',
|
||||
configurationSuspect.getString("MESSAGES.ACTION_BAR_PROGRESS"));
|
||||
BukkitRunnable actionBar = new BukkitRunnable() {//"MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE"
|
||||
@Override
|
||||
public void run() {
|
||||
prs.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(actionMessage));
|
||||
}
|
||||
};
|
||||
timeInCage.put(prs, new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() { // Future = Пометить, что когда in Cage и вышел, то удалить поток, а если зашёл и in Cage - запустить ~ Optimize
|
||||
try {
|
||||
int time = 0;
|
||||
String uuid = prs.getPlayer().getUniqueId().toString();
|
||||
PreparedStatement st = connection.prepareStatement(
|
||||
"SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?");
|
||||
st.setString(1, uuid);
|
||||
try (ResultSet resultSet = st.executeQuery()) {
|
||||
if (resultSet.next())
|
||||
time = resultSet.getInt(1);
|
||||
}
|
||||
if (time == 0) {
|
||||
prs.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&',
|
||||
configurationSuspect.getString("MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE")));
|
||||
actionBar.cancel();
|
||||
cancel();
|
||||
timeInCage.remove(prs);
|
||||
st = connection.prepareStatement("DELETE FROM players_in_cages WHERE UUID = ?");
|
||||
st.setString(1, uuid);
|
||||
st.execute();
|
||||
} else {
|
||||
if (prs.getPlayer().isOnline()) {
|
||||
st = connection.prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = " + (time - 1) + " WHERE UUID = ?");
|
||||
st.setString(1, uuid);
|
||||
st.execute();
|
||||
}
|
||||
}
|
||||
st.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
int m = 20 * 60;
|
||||
actionBar.runTaskTimer(PrisonAPI.plugin, 5, 5);
|
||||
timeInCage.get(prs).runTaskTimer(PrisonAPI.plugin, m, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.prisonlife.api.template;
|
||||
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
@@ -119,28 +120,32 @@ public class Prisoner {
|
||||
}
|
||||
|
||||
public int getSuspect() {
|
||||
try(PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT SUSPECT FROM player_stats WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getPlayer().getUniqueId().toString());
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT SUSPECT FROM player_stats WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getPlayer().getUniqueId().toString());
|
||||
|
||||
try(ResultSet resultSet = statement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
}
|
||||
}
|
||||
} catch (SQLException z) {
|
||||
z.printStackTrace();
|
||||
}
|
||||
} catch(SQLException z) {
|
||||
z.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setSuspect(int value) {
|
||||
try(PreparedStatement statement = getSqlStore().getConnection().prepareStatement("UPDATE player_stats SET SUSPECT = ? WHERE UUID = ?")) {
|
||||
statement.setInt(1, value);
|
||||
statement.setString(2, me.getPlayer().getUniqueId().toString());
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
try (PreparedStatement statement = session.getConnection().prepareStatement("UPDATE player_stats SET SUSPECT = ? WHERE UUID = ?")) {
|
||||
statement.setInt(1, value);
|
||||
statement.setString(2, me.getPlayer().getUniqueId().toString());
|
||||
|
||||
statement.executeUpdate();
|
||||
} catch(SQLException z) {
|
||||
z.printStackTrace();
|
||||
statement.executeUpdate();
|
||||
} catch (SQLException z) {
|
||||
z.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,67 +158,75 @@ public class Prisoner {
|
||||
}
|
||||
|
||||
public int getTimeLeftInCage() {
|
||||
try (PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
|
||||
try(ResultSet resultSet = statement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setTimeLeftInCage(int value) {
|
||||
try {
|
||||
PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?");
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
try(ResultSet resultSet = statement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
statement.close();
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
try {
|
||||
PreparedStatement statement = session.getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?");
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
statement.close();
|
||||
|
||||
statement = getSqlStore().getConnection().prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = ? WHERE UUID = ?");
|
||||
statement.setInt(1, value);
|
||||
statement.setString(2, me.getUniqueId().toString());
|
||||
statement.execute();
|
||||
statement = session.getConnection().prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = ? WHERE UUID = ?");
|
||||
statement.setInt(1, value);
|
||||
statement.setString(2, me.getUniqueId().toString());
|
||||
statement.execute();
|
||||
|
||||
statement.close();
|
||||
statement.close();
|
||||
}
|
||||
}
|
||||
} catch (SQLException z) {
|
||||
z.printStackTrace();
|
||||
}
|
||||
} catch(SQLException z) {
|
||||
z.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public int getBlocksLeftToBreak() {
|
||||
try (PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT BLOCKS_LEFT FROM players_in_cages WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT BLOCKS_LEFT FROM players_in_cages WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
|
||||
try(ResultSet resultSet = statement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public boolean isLocateInCage() {
|
||||
try (PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT UUID FROM players_in_cages WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT UUID FROM players_in_cages WHERE UUID = ?")) {
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
|
||||
try(ResultSet resultSet = statement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
return true;
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -231,37 +244,39 @@ public class Prisoner {
|
||||
}
|
||||
|
||||
public void register() throws SQLException {
|
||||
final Connection connection = getSqlStore().getConnection();
|
||||
try (SqlSession session = getSqlStore().openSession()) {
|
||||
final Connection connection = session.getConnection();
|
||||
|
||||
PreparedStatement statement = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?");
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
PreparedStatement statement = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?");
|
||||
statement.setString(1, me.getUniqueId().toString());
|
||||
|
||||
try(ResultSet resultSet = statement.executeQuery()) {
|
||||
if(!resultSet.next()) {
|
||||
statement.close();
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
if (!resultSet.next()) {
|
||||
statement.close();
|
||||
|
||||
statement = connection.prepareStatement(
|
||||
"INSERT INTO player_stats(NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, " +
|
||||
"G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) "
|
||||
+ "VALUES (?, ?, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0)");
|
||||
statement.setString(1, getPlayer().getName());
|
||||
statement.setString(2, me.getUniqueId().toString());
|
||||
statement.executeUpdate();
|
||||
statement.close();
|
||||
statement = connection.prepareStatement(
|
||||
"INSERT INTO player_stats(NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, " +
|
||||
"G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) "
|
||||
+ "VALUES (?, ?, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0)");
|
||||
statement.setString(1, getPlayer().getName());
|
||||
statement.setString(2, me.getUniqueId().toString());
|
||||
statement.executeUpdate();
|
||||
statement.close();
|
||||
|
||||
statement = connection.prepareStatement(
|
||||
"INSERT INTO daily_respect_task(NAME, UUID, COOLDOWN) " +
|
||||
"VALUES (?, ?, ?)");
|
||||
statement.setString(1, getPlayer().getName());
|
||||
statement.setString(2, me.getUniqueId().toString());
|
||||
statement.setInt(3, (3600 * 24));
|
||||
statement.executeUpdate();
|
||||
statement = connection.prepareStatement(
|
||||
"INSERT INTO daily_respect_task(NAME, UUID, COOLDOWN) " +
|
||||
"VALUES (?, ?, ?)");
|
||||
statement.setString(1, getPlayer().getName());
|
||||
statement.setString(2, me.getUniqueId().toString());
|
||||
statement.setInt(3, (3600 * 24));
|
||||
statement.executeUpdate();
|
||||
|
||||
level = new Level(this);
|
||||
stats = new Stats(this);
|
||||
wallet = new Wallet(this);
|
||||
level = new Level(this);
|
||||
stats = new Stats(this);
|
||||
wallet = new Wallet(this);
|
||||
}
|
||||
}
|
||||
statement.close();
|
||||
}
|
||||
statement.close();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user