1mod count;
2pub use count::*;
3
4mod fix_activities;
5pub use fix_activities::*;
6
7mod fetch;
8pub use fetch::*;
9
10mod faker;
11pub use faker::*;
12
13mod relay;
14pub use relay::*;
15
16mod register;
17pub use register::*;
18
19mod reset;
20pub use reset::*;
21
22mod update;
23pub use update::*;
24
25mod nuke;
26pub use nuke::*;
27
28mod thread;
29pub use thread::*;
30
31mod cloak;
32pub use cloak::*;
33
34mod import;
35pub use import::*;
36
37mod export;
38pub use export::*;
39
40mod attachments;
41pub use attachments::*;
42
43#[derive(Debug, Clone, clap::Subcommand)]
46pub enum CliCommand {
47 Faker{
49 count: u64,
51 },
52
53 Fetch {
55 uri: String,
57
58 #[arg(long, default_value_t = false)]
59 save: bool,
61
62 #[arg(long)]
63 fetch_as: Option<String>,
65 },
66
67 Relay {
69 #[clap(subcommand)]
70 action: RelayCommand,
72 },
73
74 Count {
76 #[arg(long, default_value_t = false)]
77 likes: bool,
79
80 #[arg(long, default_value_t = false)]
81 shares: bool,
83
84 #[arg(long, default_value_t = false)]
85 replies: bool,
87 },
88
89 Update {
91 #[arg(long, short, default_value_t = 10)]
92 days: i64,
94
95 #[arg(long)]
96 limit: Option<u64>,
98 },
99
100 Register {
102 username: String,
104
105 password: String,
108
109 #[arg(long = "name")]
111 display_name: Option<String>,
112
113 #[arg(long = "summary")]
115 summary: Option<String>,
116
117 #[arg(long = "avatar")]
119 avatar_url: Option<String>,
120
121 #[arg(long = "banner")]
123 banner_url: Option<String>,
124 },
125
126 Reset {
128 login: String,
130
131 password: String,
133 },
134
135 Nuke {
137 #[arg(long, default_value_t = false)]
139 for_real: bool,
140
141 #[arg(long, default_value_t = false)]
143 delete_objects: bool,
144 },
145
146 Thread {
148
149 },
150
151 Cloak {
153 #[arg(long, default_value_t = false)]
155 objects: bool,
156
157 #[arg(long, default_value_t = false)]
159 actors: bool,
160
161 #[arg(long, default_value_t = false)]
163 contents: bool,
164
165 #[arg(long, default_value_t = false)]
167 re_cloak: bool,
168 },
169
170 FixActivities {
172 #[arg(long, default_value_t = false)]
174 likes: bool,
175
176 #[arg(long, default_value_t = false)]
178 announces: bool,
179 },
180
181 Import {
183 file: std::path::PathBuf,
185
186 #[arg(long)]
188 from: String,
189
190 #[arg(long)]
192 to: String,
193
194 #[arg(short, long)]
196 attachment_base: Option<String>
197 },
198
199 Export {
201 actor: String,
203
204 file: std::path::PathBuf,
206
207 #[arg(long, default_value_t = false)]
209 pretty: bool,
210 },
211
212 Attachments {
214
215 },
216}
217
218pub async fn run(ctx: upub::Context, command: CliCommand) -> Result<(), Box<dyn std::error::Error>> {
219 tracing::info!("running cli task: {command:?}");
220 match command {
221 CliCommand::Faker { count } =>
222 Ok(faker(ctx, count as i64).await?),
223 CliCommand::Fetch { uri, save, fetch_as } =>
224 Ok(fetch(ctx, uri, save, fetch_as).await?),
225 CliCommand::Relay { action } =>
226 Ok(relay(ctx, action).await?),
227 CliCommand::Count { likes, shares, replies } =>
228 Ok(count(ctx, likes, shares, replies).await?),
229 CliCommand::Update { days, limit } =>
230 Ok(update_users(ctx, days, limit).await?),
231 CliCommand::Register { username, password, display_name, summary, avatar_url, banner_url } =>
232 Ok(register(ctx, username, password, display_name, summary, avatar_url, banner_url).await?),
233 CliCommand::Reset { login, password } =>
234 Ok(reset(ctx, login, password).await?),
235 CliCommand::Nuke { for_real, delete_objects } =>
236 Ok(nuke(ctx, for_real, delete_objects).await?),
237 CliCommand::Thread { } =>
238 Ok(thread(ctx).await?),
239 CliCommand::Cloak { objects, actors, contents, re_cloak } =>
240 Ok(cloak(ctx, contents, objects, actors, re_cloak).await?),
241 CliCommand::FixActivities { likes, announces } =>
242 Ok(fix_activities(ctx, likes, announces).await?),
243 CliCommand::Import { file, from, to, attachment_base } =>
244 Ok(import(ctx, file, from, to, attachment_base).await?),
245 CliCommand::Export { actor, file, pretty } =>
246 Ok(export(ctx, actor, file, pretty).await?),
247 CliCommand::Attachments { } =>
248 Ok(fix_attachments_types(ctx).await?),
249 }
250}