mostro_client/cli/
take_dispute.rs1use crate::util::messaging::get_admin_keys;
2use anyhow::Result;
3use mostro_core::prelude::*;
4use uuid::Uuid;
5
6use crate::{
7 cli::Context,
8 parser::common::{create_emoji_field_row, create_field_value_header, create_standard_table},
9 parser::{dms::print_commands_results, parse_dm_events},
10 util::{admin_send_dm, send_dm, wait_for_dm},
11};
12
13pub async fn execute_admin_add_solver(npubkey: &str, ctx: &Context) -> Result<()> {
14 println!("👑 Admin Add Solver");
15 println!("═══════════════════════════════════════");
16 let mut table = create_standard_table();
17 table.set_header(create_field_value_header());
18 table.add_row(create_emoji_field_row("🔑 ", "Solver PubKey", npubkey));
19 table.add_row(create_emoji_field_row(
20 "🎯 ",
21 "Mostro PubKey",
22 &ctx.mostro_pubkey.to_string(),
23 ));
24 println!("{table}");
25 println!("💡 Adding new solver to Mostro...\n");
26
27 let _admin_keys = get_admin_keys(ctx)?;
28
29 let take_dispute_message = Message::new_dispute(
31 Some(Uuid::new_v4()),
32 None,
33 None,
34 Action::AdminAddSolver,
35 Some(Payload::TextMessage(npubkey.to_string())),
36 )
37 .as_json()
38 .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
39
40 admin_send_dm(ctx, take_dispute_message).await?;
41
42 println!("✅ Solver added successfully!");
43
44 Ok(())
45}
46
47pub async fn execute_admin_cancel_dispute(dispute_id: &Uuid, ctx: &Context) -> Result<()> {
48 println!("👑 Admin Cancel Dispute");
49 println!("═══════════════════════════════════════");
50 let mut table = create_standard_table();
51 table.set_header(create_field_value_header());
52 table.add_row(create_emoji_field_row(
53 "🆔 ",
54 "Dispute ID",
55 &dispute_id.to_string(),
56 ));
57 table.add_row(create_emoji_field_row(
58 "🎯 ",
59 "Mostro PubKey",
60 &ctx.mostro_pubkey.to_string(),
61 ));
62 println!("{table}");
63 println!("💡 Canceling dispute...\n");
64
65 let _admin_keys = get_admin_keys(ctx)?;
66
67 let take_dispute_message =
69 Message::new_dispute(Some(*dispute_id), None, None, Action::AdminCancel, None)
70 .as_json()
71 .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
72
73 admin_send_dm(ctx, take_dispute_message).await?;
74
75 println!("✅ Dispute canceled successfully!");
76
77 Ok(())
78}
79
80pub async fn execute_admin_settle_dispute(dispute_id: &Uuid, ctx: &Context) -> Result<()> {
81 println!("👑 Admin Settle Dispute");
82 println!("═══════════════════════════════════════");
83 let mut table = create_standard_table();
84 table.set_header(create_field_value_header());
85 table.add_row(create_emoji_field_row(
86 "🆔 ",
87 "Dispute ID",
88 &dispute_id.to_string(),
89 ));
90 table.add_row(create_emoji_field_row(
91 "🎯 ",
92 "Mostro PubKey",
93 &ctx.mostro_pubkey.to_string(),
94 ));
95 println!("{table}");
96 println!("💡 Settling dispute...\n");
97
98 let _admin_keys = get_admin_keys(ctx)?;
99
100 let take_dispute_message =
102 Message::new_dispute(Some(*dispute_id), None, None, Action::AdminSettle, None)
103 .as_json()
104 .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
105 admin_send_dm(ctx, take_dispute_message).await?;
106
107 println!("✅ Dispute settled successfully!");
108 Ok(())
109}
110
111pub async fn execute_take_dispute(dispute_id: &Uuid, ctx: &Context) -> Result<()> {
112 println!("👑 Admin Take Dispute");
113 println!("═══════════════════════════════════════");
114 let mut table = create_standard_table();
115 table.set_header(create_field_value_header());
116 table.add_row(create_emoji_field_row(
117 "🆔 ",
118 "Dispute ID",
119 &dispute_id.to_string(),
120 ));
121 table.add_row(create_emoji_field_row(
122 "🎯 ",
123 "Mostro PubKey",
124 &ctx.mostro_pubkey.to_string(),
125 ));
126 println!("{table}");
127 println!("💡 Taking dispute...\n");
128
129 let admin_keys = get_admin_keys(ctx)?;
130
131 let take_dispute_message = Message::new_dispute(
133 Some(*dispute_id),
134 None,
135 None,
136 Action::AdminTakeDispute,
137 None,
138 )
139 .as_json()
140 .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
141
142 let sent_message = send_dm(
144 &ctx.client,
145 Some(admin_keys),
146 &ctx.trade_keys,
147 &ctx.mostro_pubkey,
148 take_dispute_message,
149 None,
150 false,
151 );
152
153 let recv_event = wait_for_dm(ctx, Some(admin_keys), sent_message).await?;
155
156 let messages = parse_dm_events(recv_event, admin_keys, None).await;
158 if let Some((message, _, sender_pubkey)) = messages.first() {
159 let message_kind = message.get_inner_message_kind();
160 if *sender_pubkey != ctx.mostro_pubkey {
161 return Err(anyhow::anyhow!("Received response from wrong sender"));
162 }
163 if message_kind.action == Action::AdminTookDispute {
164 print_commands_results(message_kind, ctx).await?;
165 } else {
166 return Err(anyhow::anyhow!(
167 "Received response with mismatched action. Expected: {:?}, Got: {:?}",
168 Action::AdminTookDispute,
169 message_kind.action
170 ));
171 }
172 } else {
173 return Err(anyhow::anyhow!("No response received from Mostro"));
174 }
175
176 Ok(())
177}