mostro_client/cli/
take_dispute.rs

1use 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    // Create takebuy message
30    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    // Create takebuy message
68    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    // Create takebuy message
101    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    // Create takebuy message
132    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    // Send the dispute message and wait for response
143    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    // Wait for incoming DM response
154    let recv_event = wait_for_dm(ctx, Some(admin_keys), sent_message).await?;
155
156    // Parse the incoming DM
157    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}