1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//! # echo_channels
//!
//! IM channel plugin system — unified ChannelPlugin interface + concrete platform implementations.
//!
//! ## Quick Start
//!
//! ```rust,no_run
//! use echo_integration::channels::prelude::*;
//! use async_trait::async_trait;
//! use echo_core::error::Result;
//! use std::sync::Arc;
//!
//! struct DummyHandler;
//!
//! #[async_trait]
//! impl MessageHandler for DummyHandler {
//! async fn handle(&self, msg: InboundMessage) -> Result<OutboundMessage> {
//! Ok(OutboundMessage::new(
//! msg.channel_id,
//! msg.chat_id,
//! msg.chat_type,
//! "ok",
//! ))
//! }
//!
//! async fn reply(&self, _msg: OutboundMessage) -> Result<()> {
//! Ok(())
//! }
//! }
//!
//! # async fn example() -> Result<()> {
//! let mut manager = ChannelManager::new();
//!
//! // Register QQ Bot
//! let qq_config = QqConfig {
//! app_id: "your-app-id".into(),
//! client_secret: "your-secret".into(),
//! };
//! manager.register(Box::new(QqChannel::new(qq_config)?));
//!
//! // Register Feishu (long-poll mode, no public IP required)
//! let feishu_config = FeishuConfig::new_long_poll(
//! "your-feishu-app-id".into(),
//! "your-feishu-secret".into(),
//! );
//! manager.register(Box::new(FeishuChannel::new(feishu_config)?));
//!
//! // Start all channels
//! let handler_factory = |_channel_id: &str| -> Arc<dyn MessageHandler> {
//! Arc::new(DummyHandler)
//! };
//! for result in manager.start_all(handler_factory).await {
//! result?;
//! }
//! # Ok(())
//! # }
//! ```
pub use ;
pub use ;
pub use ChannelManager;
pub use ;
pub use *;