44import com .westerhoud .osrs .taskman .domain .AccountCredentials ;
55import com .westerhoud .osrs .taskman .domain .AccountProgress ;
66import com .westerhoud .osrs .taskman .domain .Task ;
7+ import com .westerhoud .osrs .taskman .domain .TaskmanCommandData ;
78import com .westerhoud .osrs .taskman .service .TaskService ;
89import com .westerhoud .osrs .taskman .ui .CurrentTaskOverlay ;
910import com .westerhoud .osrs .taskman .ui .TaskmanPluginPanel ;
1011import java .awt .image .BufferedImage ;
12+ import java .io .IOException ;
1113import javax .inject .Inject ;
1214import javax .swing .SwingUtilities ;
1315import lombok .extern .slf4j .Slf4j ;
16+ import net .runelite .api .ChatMessageType ;
1417import net .runelite .api .Client ;
18+ import net .runelite .api .GameState ;
19+ import net .runelite .api .MessageNode ;
20+ import net .runelite .api .Player ;
21+ import net .runelite .api .events .ChatMessage ;
22+ import net .runelite .api .events .GameStateChanged ;
23+ import net .runelite .api .events .GameTick ;
24+ import net .runelite .client .callback .ClientThread ;
25+ import net .runelite .client .chat .ChatColorType ;
26+ import net .runelite .client .chat .ChatCommandManager ;
27+ import net .runelite .client .chat .ChatMessageBuilder ;
1528import net .runelite .client .config .ConfigManager ;
1629import net .runelite .client .eventbus .Subscribe ;
1730import net .runelite .client .events .ConfigChanged ;
2134import net .runelite .client .ui .NavigationButton ;
2235import net .runelite .client .ui .overlay .OverlayManager ;
2336import net .runelite .client .util .ImageUtil ;
37+ import net .runelite .client .util .Text ;
2438import okhttp3 .OkHttpClient ;
2539
2640@ Slf4j
2741@ PluginDescriptor (name = "Taskman" )
2842public class TaskmanPlugin extends Plugin {
2943
30- public static final String TASKMAN_CONFIG_GROUP = "taskman" ;
44+ private static final String TASKMAN_CONFIG_GROUP = "taskman" ;
45+ private static final String TASKMAN_CHAT_COMMAND = "!taskman" ;
3146 @ Inject private Client client ;
47+ @ Inject private ClientThread clientThread ;
3248 @ Inject private ClientToolbar clientToolbar ;
3349 @ Inject private TaskmanConfig config ;
3450 @ Inject private OkHttpClient okHttpClient ;
3551 @ Inject private OverlayManager overlayManager ;
3652 @ Inject private CurrentTaskOverlay currentTaskOverlay ;
53+ @ Inject private ChatCommandManager chatCommandManager ;
3754
3855 private TaskmanPluginPanel sidePanel ;
3956 private TaskService taskService ;
4057 private NavigationButton navigationButton ;
58+ private boolean loggedIn = false ;
59+ private boolean sidePanelInitialized = false ;
4160
4261 @ Override
4362 protected void startUp () throws Exception {
4463 // Sidebar
4564 final BufferedImage icon = ImageUtil .loadImageResource (getClass (), "icon.png" );
46-
4765 taskService = new TaskService (okHttpClient );
66+ chatCommandManager .registerCommandAsync (TASKMAN_CHAT_COMMAND , this ::getTaskmanCommandData );
4867
4968 sidePanel = new TaskmanPluginPanel (this );
5069 navigationButton =
@@ -63,28 +82,67 @@ protected void shutDown() throws Exception {
6382 // Sidebar
6483 clientToolbar .removeNavigation (navigationButton );
6584 overlayManager .remove (currentTaskOverlay );
85+ chatCommandManager .unregisterCommand (TASKMAN_CHAT_COMMAND );
6686 }
6787
6888 public Task getCurrentTask () throws Exception {
69- final Task task = taskService .getCurrentTask (getCredentials ());
89+ final Task task = taskService .getCurrentTask (getCredentials (), getRsn () );
7090 currentTaskOverlay .setTask (task );
7191 return task ;
7292 }
7393
7494 public Task generateTask () throws Exception {
75- final Task task = taskService .generateTask (getCredentials ());
95+ final Task task = taskService .generateTask (getCredentials (), getRsn () );
7696 currentTaskOverlay .setTask (task );
7797 return task ;
7898 }
7999
80100 public Task completeTask () throws Exception {
81- final Task task = taskService .completeTask (getCredentials ());
101+ final Task task = taskService .completeTask (getCredentials (), getRsn () );
82102 currentTaskOverlay .setTask (task );
83103 return task ;
84104 }
85105
86106 public AccountProgress progress () throws Exception {
87- return taskService .getAccountProgress (getCredentials ());
107+ return taskService .getAccountProgress (getCredentials (), getRsn ());
108+ }
109+
110+ private void getTaskmanCommandData (final ChatMessage chatMessage , final String message ) {
111+ if (!config .taskmanCommand ()) {
112+ return ;
113+ }
114+
115+ final ChatMessageType type = chatMessage .getType ();
116+ final String rsn ;
117+ if (type == ChatMessageType .PRIVATECHATOUT ) {
118+ rsn = getRsn ();
119+ } else {
120+ rsn = Text .removeTags (chatMessage .getName ()).replace ('\u00A0' , ' ' );
121+ }
122+
123+ final TaskmanCommandData data ;
124+ try {
125+ data = taskService .getChatCommandData (rsn );
126+ } catch (final IOException ex ) {
127+ log .debug ("Unable to get chat command data" , ex );
128+ return ;
129+ }
130+
131+ final String response =
132+ new ChatMessageBuilder ()
133+ .append (ChatColorType .NORMAL )
134+ .append ("Progress: " )
135+ .append (ChatColorType .HIGHLIGHT )
136+ .append (data .getProgressPercentage () + "% " + data .getTier ())
137+ .append (ChatColorType .NORMAL )
138+ .append (" Current task: " )
139+ .append (ChatColorType .HIGHLIGHT )
140+ .append (data .getTask ().getName ())
141+ .build ();
142+
143+ final MessageNode messageNode = chatMessage .getMessageNode ();
144+ messageNode .setRuneLiteFormatMessage (response );
145+ client .refreshChat ();
88146 }
89147
90148 private AccountCredentials getCredentials () {
@@ -100,6 +158,32 @@ private AccountCredentials getCredentials() {
100158 }
101159 }
102160
161+ private String getRsn () {
162+ final Player player = client .getLocalPlayer ();
163+ if (player == null ) {
164+ throw new IllegalArgumentException ("Please login first!" );
165+ }
166+ return player .getName ();
167+ }
168+
169+ @ Subscribe
170+ public void onGameStateChanged (final GameStateChanged gameStateChanged ) {
171+ if (gameStateChanged .getGameState () == GameState .LOGGED_IN ) {
172+ loggedIn = true ;
173+ } else if (gameStateChanged .getGameState () == GameState .LOGIN_SCREEN ) {
174+ loggedIn = false ;
175+ sidePanel .onLogout ();
176+ }
177+ }
178+
179+ @ Subscribe
180+ public void onGameTick (final GameTick gameTick ) {
181+ if (!sidePanelInitialized && loggedIn ) {
182+ sidePanel .init ();
183+ sidePanelInitialized = true ;
184+ }
185+ }
186+
103187 @ Subscribe
104188 public void onConfigChanged (final ConfigChanged configChanged ) {
105189 if (configChanged .getGroup ().equals (TASKMAN_CONFIG_GROUP )) {
0 commit comments