Replace FredrickProcessor dependence on NoteDao

This commit is contained in:
P0nk
2022-12-27 10:52:49 +01:00
parent 389b3ad2a4
commit af14da987e
8 changed files with 47 additions and 58 deletions

View File

@@ -9203,20 +9203,6 @@ public class Character extends AbstractCharacterObject {
}
}
public void changeName(String name) {
FredrickProcessor.removeFredrickReminders(this.getId());
this.name = name;
try (Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("UPDATE `characters` SET `name` = ? WHERE `id` = ?")) {
ps.setString(1, name);
ps.setInt(2, id);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public int getDoorSlot() {
if (doorSlot != -1) {
return doorSlot;

View File

@@ -30,21 +30,18 @@ import client.inventory.InventoryType;
import client.inventory.Item;
import client.inventory.ItemFactory;
import client.inventory.manipulator.InventoryManipulator;
import database.DaoException;
import database.note.NoteDao;
import model.Note;
import net.server.Server;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import server.ItemInformationProvider;
import server.maps.HiredMerchant;
import service.NoteService;
import tools.DatabaseConnection;
import tools.PacketCreator;
import tools.Pair;
import java.sql.*;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@@ -57,6 +54,12 @@ public class FredrickProcessor {
private static final Logger log = LoggerFactory.getLogger(FredrickProcessor.class);
private static final int[] dailyReminders = new int[]{2, 5, 10, 15, 30, 60, 90, Integer.MAX_VALUE};
private final NoteService noteService;
public FredrickProcessor(NoteService noteService) {
this.noteService = noteService;
}
private static byte canRetrieveFromFredrick(Character chr, List<Pair<Item, InventoryType>> items) {
if (!Inventory.checkSpotsAndOwnership(chr, items)) {
List<Integer> itemids = new LinkedList<>();
@@ -130,10 +133,6 @@ public class FredrickProcessor {
}
}
public static void removeFredrickReminders(int cid) {
removeFredrickReminders(Collections.singletonList(new Pair<>(cid, 0)));
}
private static void removeFredrickReminders(List<Pair<Integer, Integer>> expiredCids) {
List<String> expiredCnames = new LinkedList<>();
for (Pair<Integer, Integer> id : expiredCids) {
@@ -156,7 +155,7 @@ public class FredrickProcessor {
}
}
public static void runFredrickSchedule() {
public void runFredrickSchedule() {
try (Connection con = DatabaseConnection.getConnection()) {
List<Pair<Integer, Integer>> expiredCids = new LinkedList<>();
List<Pair<Pair<Integer, String>, Integer>> notifCids = new LinkedList<>();
@@ -244,7 +243,7 @@ public class FredrickProcessor {
ps.addBatch();
String msg = fredrickReminderMessage(cid.getRight() - 1);
saveFredrickReminderNote(msg, cid.getLeft().getRight());
noteService.sendNormal(msg, "FREDRICK", cid.getLeft().getRight());
}
ps.executeBatch();
@@ -255,15 +254,6 @@ public class FredrickProcessor {
}
}
private static void saveFredrickReminderNote(String message, String to) {
Note reminderNote = Note.createNormal(message, "FREDRICK", to, Server.getInstance().getCurrentTime());
try {
NoteDao.save(reminderNote);
} catch (DaoException e) {
log.error("Failed to save Fredrick reminder note", e);
}
}
private static boolean deleteFredrickItems(int cid) {
try (Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM `inventoryitems` WHERE `type` = ? AND `characterid` = ?")) {
@@ -278,7 +268,7 @@ public class FredrickProcessor {
}
}
public static void fredrickRetrieveItems(Client c) { // thanks Gustav for pointing out the dupe on Fredrick handling
public void fredrickRetrieveItems(Client c) { // thanks Gustav for pointing out the dupe on Fredrick handling
if (c.tryacquireClient()) {
try {
Character chr = c.getPlayer();

View File

@@ -57,7 +57,7 @@ public class NoteDao {
}
}
private static Optional<Note> findById(Handle handle, int id) {
private Optional<Note> findById(Handle handle, int id) {
final Optional<Note> note;
try {
note = handle.createQuery("""
@@ -74,7 +74,7 @@ public class NoteDao {
return note;
}
private static void deleteById(Handle handle, int id) {
private void deleteById(Handle handle, int id) {
try {
handle.createUpdate("""
UPDATE notes

View File

@@ -1,12 +1,14 @@
package net;
import client.processor.npc.FredrickProcessor;
import service.NoteService;
import java.util.Objects;
public record ChannelDependencies(NoteService noteService) {
public record ChannelDependencies(NoteService noteService, FredrickProcessor fredrickProcessor) {
public ChannelDependencies {
Objects.requireNonNull(noteService);
Objects.requireNonNull(fredrickProcessor);
}
}

View File

@@ -38,7 +38,7 @@ public final class PacketProcessor {
private static final Logger log = LoggerFactory.getLogger(PacketProcessor.class);
private static final Map<String, PacketProcessor> instances = new LinkedHashMap<>();
private static ChannelDependencies channelDependencies;
private static ChannelDependencies channelDeps;
private PacketHandler[] handlers;
@@ -53,7 +53,7 @@ public final class PacketProcessor {
}
public static void registerGameHandlerDependencies(ChannelDependencies channelDependencies) {
PacketProcessor.channelDependencies = channelDependencies;
PacketProcessor.channelDeps = channelDependencies;
}
public static PacketProcessor getLoginServerProcessor() {
@@ -61,7 +61,7 @@ public final class PacketProcessor {
}
public static PacketProcessor getChannelServerProcessor(int world, int channel) {
if (channelDependencies == null) {
if (channelDeps == null) {
throw new IllegalStateException("Unable to get channel server processor - dependencies are not registered");
}
@@ -152,7 +152,7 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.ITEM_SORT, new InventoryMergeHandler());
registerHandler(RecvOpcode.ITEM_MOVE, new ItemMoveHandler());
registerHandler(RecvOpcode.MESO_DROP, new MesoDropHandler());
registerHandler(RecvOpcode.PLAYER_LOGGEDIN, new PlayerLoggedinHandler(channelDependencies.noteService()));
registerHandler(RecvOpcode.PLAYER_LOGGEDIN, new PlayerLoggedinHandler(channelDeps.noteService()));
registerHandler(RecvOpcode.CHANGE_MAP, new ChangeMapHandler());
registerHandler(RecvOpcode.MOVE_LIFE, new MoveLifeHandler());
registerHandler(RecvOpcode.CLOSE_RANGE_ATTACK, new CloseRangeDamageHandler());
@@ -160,7 +160,7 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.MAGIC_ATTACK, new MagicDamageHandler());
registerHandler(RecvOpcode.TAKE_DAMAGE, new TakeDamageHandler());
registerHandler(RecvOpcode.MOVE_PLAYER, new MovePlayerHandler());
registerHandler(RecvOpcode.USE_CASH_ITEM, new UseCashItemHandler(channelDependencies.noteService()));
registerHandler(RecvOpcode.USE_CASH_ITEM, new UseCashItemHandler(channelDeps.noteService()));
registerHandler(RecvOpcode.USE_ITEM, new UseItemHandler());
registerHandler(RecvOpcode.USE_RETURN_SCROLL, new UseItemHandler());
registerHandler(RecvOpcode.USE_UPGRADE_SCROLL, new ScrollHandler());
@@ -202,7 +202,7 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.MESSENGER, new MessengerHandler());
registerHandler(RecvOpcode.NPC_ACTION, new NPCAnimationHandler());
registerHandler(RecvOpcode.CHECK_CASH, new TouchingCashShopHandler());
registerHandler(RecvOpcode.CASHSHOP_OPERATION, new CashOperationHandler(channelDependencies.noteService()));
registerHandler(RecvOpcode.CASHSHOP_OPERATION, new CashOperationHandler(channelDeps.noteService()));
registerHandler(RecvOpcode.COUPON_CODE, new CouponCodeHandler());
registerHandler(RecvOpcode.SPAWN_PET, new SpawnPetHandler());
registerHandler(RecvOpcode.MOVE_PET, new MovePetHandler());
@@ -215,11 +215,11 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.CANCEL_DEBUFF, new CancelDebuffHandler());
registerHandler(RecvOpcode.USE_SKILL_BOOK, new SkillBookHandler());
registerHandler(RecvOpcode.SKILL_MACRO, new SkillMacroHandler());
registerHandler(RecvOpcode.NOTE_ACTION, new NoteActionHandler(channelDependencies.noteService()));
registerHandler(RecvOpcode.NOTE_ACTION, new NoteActionHandler(channelDeps.noteService()));
registerHandler(RecvOpcode.CLOSE_CHALKBOARD, new CloseChalkboardHandler());
registerHandler(RecvOpcode.USE_MOUNT_FOOD, new UseMountFoodHandler());
registerHandler(RecvOpcode.MTS_OPERATION, new MTSHandler());
registerHandler(RecvOpcode.RING_ACTION, new RingActionHandler(channelDependencies.noteService()));
registerHandler(RecvOpcode.RING_ACTION, new RingActionHandler(channelDeps.noteService()));
registerHandler(RecvOpcode.SPOUSE_CHAT, new SpouseChatHandler());
registerHandler(RecvOpcode.PET_AUTO_POT, new PetAutoPotHandler());
registerHandler(RecvOpcode.PET_EXCLUDE_ITEMS, new PetExcludeItemsHandler());
@@ -273,7 +273,7 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.COCONUT, new CoconutHandler());
registerHandler(RecvOpcode.ARAN_COMBO_COUNTER, new AranComboHandler());
registerHandler(RecvOpcode.CLICK_GUIDE, new ClickGuideHandler());
registerHandler(RecvOpcode.FREDRICK_ACTION, new FredrickHandler());
registerHandler(RecvOpcode.FREDRICK_ACTION, new FredrickHandler(channelDeps.fredrickProcessor()));
registerHandler(RecvOpcode.MONSTER_CARNIVAL, new MonsterCarnivalHandler());
registerHandler(RecvOpcode.REMOTE_STORE, new RemoteStoreHandler());
registerHandler(RecvOpcode.WEDDING_ACTION, new WeddingHandler());

View File

@@ -30,6 +30,7 @@ import client.inventory.Item;
import client.inventory.ItemFactory;
import client.inventory.manipulator.CashIdGenerator;
import client.newyear.NewYearCardRecord;
import client.processor.npc.FredrickProcessor;
import config.YamlConfig;
import constants.game.GameConstants;
import constants.inventory.ItemConstants;
@@ -842,7 +843,7 @@ public class Server {
throw new IllegalStateException("Failed to initiate a connection to the database");
}
registerChannelDependencies();
ChannelDependencies channelDependencies = registerChannelDependencies();
final ExecutorService initExecutor = Executors.newFixedThreadPool(10);
// Run slow operations asynchronously to make startup faster
@@ -872,7 +873,7 @@ public class Server {
}
ThreadManager.getInstance().start();
initializeTimelyTasks(); // aggregated method for timely tasks thanks to lxconan
initializeTimelyTasks(channelDependencies); // aggregated method for timely tasks thanks to lxconan
try {
int worldCount = Math.min(GameConstants.WORLD_NAMES.length, YamlConfig.config.server.WORLDS);
@@ -920,14 +921,14 @@ public class Server {
}
}
private void registerChannelDependencies() {
NoteDao noteDao = new NoteDao();
ChannelDependencies channelDependencies = new ChannelDependencies(
new NoteService(noteDao)
);
private ChannelDependencies registerChannelDependencies() {
NoteService noteService = new NoteService(new NoteDao());
FredrickProcessor fredrickProcessor = new FredrickProcessor(noteService);
ChannelDependencies channelDependencies = new ChannelDependencies(noteService, fredrickProcessor);
PacketProcessor.registerGameHandlerDependencies(channelDependencies);
return channelDependencies;
}
private LoginServer initLoginServer(int port) {
@@ -948,7 +949,7 @@ public class Server {
}
}
private void initializeTimelyTasks() {
private void initializeTimelyTasks(ChannelDependencies channelDependencies) {
TimerManager tMan = TimerManager.getInstance();
tMan.start();
tMan.register(tMan.purge(), YamlConfig.config.server.PURGING_INTERVAL);//Purging ftw...
@@ -962,7 +963,7 @@ public class Server {
tMan.register(new LoginCoordinatorTask(), HOURS.toMillis(1), timeLeft);
tMan.register(new EventRecallCoordinatorTask(), HOURS.toMillis(1), timeLeft);
tMan.register(new LoginStorageTask(), MINUTES.toMillis(2), MINUTES.toMillis(2));
tMan.register(new DueyFredrickTask(), HOURS.toMillis(1), timeLeft);
tMan.register(new DueyFredrickTask(channelDependencies.fredrickProcessor()), HOURS.toMillis(1), timeLeft);
tMan.register(new InvitationTask(), SECONDS.toMillis(30), SECONDS.toMillis(30));
tMan.register(new RespawnTask(), YamlConfig.config.server.RESPAWN_INTERVAL, YamlConfig.config.server.RESPAWN_INTERVAL);

View File

@@ -31,6 +31,11 @@ import net.packet.InPacket;
* @author kevintjuh93
*/
public class FredrickHandler extends AbstractPacketHandler {
private final FredrickProcessor fredrickProcessor;
public FredrickHandler(FredrickProcessor fredrickProcessor) {
this.fredrickProcessor = fredrickProcessor;
}
@Override
public void handlePacket(InPacket p, Client c) {
@@ -42,7 +47,7 @@ public class FredrickHandler extends AbstractPacketHandler {
//c.sendPacket(PacketCreator.getFredrick((byte) 0x24));
break;
case 0x1A:
FredrickProcessor.fredrickRetrieveItems(c);
fredrickProcessor.fredrickRetrieveItems(c);
break;
case 0x1C: //Exit
break;

View File

@@ -26,10 +26,15 @@ import client.processor.npc.FredrickProcessor;
* @author Ronan
*/
public class DueyFredrickTask implements Runnable {
private final FredrickProcessor fredrickProcessor;
public DueyFredrickTask(FredrickProcessor fredrickProcessor) {
this.fredrickProcessor = fredrickProcessor;
}
@Override
public void run() {
FredrickProcessor.runFredrickSchedule();
fredrickProcessor.runFredrickSchedule();
DueyProcessor.runDueyExpireSchedule();
}
}