Guest User

wevibe-chorus-pro.diff

a guest
Oct 29th, 2026
21
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 12.68 KB | None | 0 0
  1. diff --git a/crates/buttplug_server/src/device/protocol_impl/wevibe_chorus.rs b/crates/buttplug_server/src/device/protocol_impl/wevibe_chorus.rs
  2. index 35f9ed0f..ee05d8c4 100644
  3. --- a/crates/buttplug_server/src/device/protocol_impl/wevibe_chorus.rs
  4. +++ b/crates/buttplug_server/src/device/protocol_impl/wevibe_chorus.rs
  5. @@ -55,30 +55,26 @@ impl ProtocolInitializer for WeVibeChorusInitializer {
  6.  
  7.  pub struct WeVibeChorus {
  8.    num_vibrators: u8,
  9. -  speeds: [AtomicU8; 2],
  10. +  speeds: [AtomicU8; 3],
  11.  }
  12.  
  13.  impl WeVibeChorus {
  14.    fn new(num_vibrators: u8) -> Self {
  15.      Self {
  16.        num_vibrators,
  17. -      speeds: [AtomicU8::default(), AtomicU8::default()],
  18. +      speeds: [
  19. +        AtomicU8::default(),
  20. +        AtomicU8::default(),
  21. +        AtomicU8::default(),
  22. +      ],
  23.      }
  24.    }
  25. -}
  26.  
  27. -impl ProtocolHandler for WeVibeChorus {
  28. -  fn handle_output_vibrate_cmd(
  29. -    &self,
  30. -    feature_index: u32,
  31. -    _feature_id: uuid::Uuid,
  32. -    speed: u32,
  33. -  ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
  34. -    self.speeds[feature_index as usize].store(speed as u8, Ordering::Relaxed);
  35. +  fn two_motor_packet(&self) -> Vec<u8> {
  36.      let max_vibrators = if self.num_vibrators > 1 { 1 } else { 0 };
  37.      let r_speed_int = self.speeds[0].load(Ordering::Relaxed);
  38.      let r_speed_ext = self.speeds[max_vibrators].load(Ordering::Relaxed);
  39. -    let data = if r_speed_int == 0 && r_speed_ext == 0 {
  40. +    if r_speed_int == 0 && r_speed_ext == 0 {
  41.        vec![0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
  42.      } else {
  43.        // Note the motor order is flipped for the Chorus
  44. @@ -94,6 +90,54 @@ impl ProtocolHandler for WeVibeChorus {
  45.          0x00,
  46.          0x00,
  47.        ]
  48. +    }
  49. +  }
  50. +
  51. +  // The Chorus Pro uses the We-Connect app's 0xe0 command: three speeds (external tip,
  52. +  // internal, external base), then one pattern byte per motor (0x03 steady, 0xaa off). Unlike
  53. +  // the 0x0f command, this doesn't overwrite the toy's stored stand-alone settings, which 0x0f
  54. +  // can leave with motors disabled.
  55. +  fn three_motor_packet(&self) -> Vec<u8> {
  56. +    // Features keep the two-motor Chorus order (internal, external), with the external base
  57. +    // added as feature 2, so feature 0 goes in the middle slot.
  58. +    let speeds: Vec<u8> = [1, 0, 2]
  59. +      .iter()
  60. +      .map(|&i| self.speeds[i].load(Ordering::Relaxed))
  61. +      .collect();
  62. +    let pattern = |speed: u8| if speed == 0 { 0xaa } else { 0x03 };
  63. +    vec![
  64. +      0xe0,
  65. +      speeds[0],
  66. +      speeds[1],
  67. +      speeds[2],
  68. +      0x00,
  69. +      0x00,
  70. +      0x00,
  71. +      0x00,
  72. +      0x00,
  73. +      pattern(speeds[0]),
  74. +      pattern(speeds[1]),
  75. +      pattern(speeds[2]),
  76. +      0x00,
  77. +      0x00,
  78. +      0x00,
  79. +      0x00,
  80. +    ]
  81. +  }
  82. +}
  83. +
  84. +impl ProtocolHandler for WeVibeChorus {
  85. +  fn handle_output_vibrate_cmd(
  86. +    &self,
  87. +    feature_index: u32,
  88. +    _feature_id: uuid::Uuid,
  89. +    speed: u32,
  90. +  ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
  91. +    self.speeds[feature_index as usize].store(speed as u8, Ordering::Relaxed);
  92. +    let data = if self.num_vibrators > 2 {
  93. +      self.three_motor_packet()
  94. +    } else {
  95. +      self.two_motor_packet()
  96.      };
  97.      Ok(vec![
  98.        HardwareWriteCmd::new(&[WEVIBE_CHORUS_PROTOCOL_UUID], Endpoint::Tx, data, true).into(),
  99. diff --git a/crates/buttplug_server_device_config/device-config/protocols/wevibe-chorus.yml b/crates/buttplug_server_device_config/device-config/protocols/wevibe-chorus.yml
  100. index f60e59c2..09565789 100644
  101. --- a/crates/buttplug_server_device_config/device-config/protocols/wevibe-chorus.yml
  102. +++ b/crates/buttplug_server_device_config/device-config/protocols/wevibe-chorus.yml
  103. @@ -18,6 +18,35 @@ defaults:
  104.      index: 1
  105.    id: 5228aefe-bc48-445c-8129-48c3cebf6729
  106.  configurations:
  107. +- identifier:
  108. +  - Chorus Pro
  109. +  name: WeVibe Chorus Pro
  110. +  features:
  111. +  - description: Internal Vibrator
  112. +    id: 6e51328e-0384-4e18-b1c9-004512670487
  113. +    output:
  114. +      vibrate:
  115. +        value:
  116. +        - 0
  117. +        - 30
  118. +    index: 0
  119. +  - description: External Tip Vibrator
  120. +    id: 68285a0d-1d85-4e45-a4f8-1ad969291d0a
  121. +    output:
  122. +      vibrate:
  123. +        value:
  124. +        - 0
  125. +        - 30
  126. +    index: 1
  127. +  - description: External Base Vibrator
  128. +    id: 81b86559-0495-4931-8dae-a10100678f76
  129. +    output:
  130. +      vibrate:
  131. +        value:
  132. +        - 0
  133. +        - 30
  134. +    index: 2
  135. +  id: 0efb42ee-2c70-4fb6-8636-4b4f452f7b93
  136.  - identifier:
  137.    - Sync 2
  138.    name: WeVibe Sync 2
  139. @@ -65,6 +94,7 @@ communication:
  140.  - btle:
  141.      names:
  142.      - Chorus
  143. +    - Chorus Pro
  144.      - skeena
  145.      - Sync 2
  146.      - Sync O
  147. diff --git a/crates/buttplug_tests/tests/test_device_protocols.rs b/crates/buttplug_tests/tests/test_device_protocols.rs
  148. index 7c5043eb..e078ee48 100644
  149. --- a/crates/buttplug_tests/tests/test_device_protocols.rs
  150. +++ b/crates/buttplug_tests/tests/test_device_protocols.rs
  151. @@ -260,6 +260,7 @@ async fn load_test_case(test_file: &str) -> DeviceTestCase {
  152.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  153.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  154.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  155. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  156.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  157.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  158.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  159. @@ -396,6 +397,7 @@ async fn test_device_protocols_embedded_v4(test_file: &str) {
  160.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  161.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  162.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  163. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  164.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  165.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  166.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  167. @@ -529,6 +531,7 @@ async fn test_device_protocols_json_v4(test_file: &str) {
  168.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  169.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  170.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  171. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  172.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  173.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  174.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  175. @@ -665,6 +668,7 @@ async fn test_device_protocols_embedded_v3(test_file: &str) {
  176.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  177.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  178.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  179. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  180.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  181.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  182.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  183. @@ -789,6 +793,7 @@ async fn test_device_protocols_json_v3(test_file: &str) {
  184.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  185.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  186.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  187. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  188.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  189.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  190.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  191. @@ -914,6 +919,7 @@ async fn test_device_protocols_embedded_v2(test_file: &str) {
  192.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  193.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  194.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  195. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  196.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  197.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  198.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  199. @@ -1037,6 +1043,7 @@ async fn test_device_protocols_json_v2(test_file: &str) {
  200.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  201.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  202.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  203. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  204.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  205.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  206.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  207. @@ -1160,6 +1167,7 @@ async fn test_device_protocols_embedded_v1(test_file: &str) {
  208.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  209.  #[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  210.  #[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  211. +#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  212.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  213.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  214.  #[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  215. @@ -1236,6 +1244,7 @@ async fn test_device_protocols_json_v1(test_file: &str) {
  216.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  217.  //#[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  218.  //#[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  219. +//#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  220.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  221.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  222.  //#[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  223. @@ -1308,6 +1317,7 @@ async fn test_device_protocols_embedded_v0(test_file: &str) {
  224.  #[test_case("test_wetoy_protocol.yaml" ; "WeToy Protocol")]
  225.  //#[test_case("test_wevibe_4plus.yaml" ; "WeVibe Protocol (Legacy) - 4 Plus")]
  226.  //#[test_case("test_wevibe_chorus.yaml" ; "WeVibe Protocol (Chorus) - Chorus")]
  227. +//#[test_case("test_wevibe_chorus_pro.yaml" ; "WeVibe Protocol (Chorus) - Chorus Pro")]
  228.  #[test_case("test_wevibe_moxie.yaml" ; "WeVibe Protocol (8bit) - Moxie")]
  229.  #[test_case("test_wevibe_pivot.yaml" ; "WeVibe Protocol (Legacy) - Pivot")]
  230.  //#[test_case("test_wevibe_vector.yaml" ; "WeVibe Protocol (8bit) - Vector")]
  231. diff --git a/crates/buttplug_tests/tests/util/device_test/device_test_case/test_wevibe_chorus_pro.yaml b/crates/buttplug_tests/tests/util/device_test/device_test_case/test_wevibe_chorus_pro.yaml
  232. new file mode 100644
  233. index 00000000..59584444
  234. --- /dev/null
  235. +++ b/crates/buttplug_tests/tests/util/device_test/device_test_case/test_wevibe_chorus_pro.yaml
  236. @@ -0,0 +1,50 @@
  237. +devices:
  238. +  - identifier:
  239. +      name: "Chorus Pro"
  240. +    expected_name: "WeVibe Chorus Pro"
  241. +device_commands:
  242. +  - !Messages
  243. +      device_index: 0
  244. +      messages:
  245. +        - !Vibrate
  246. +          - Index: 0
  247. +            Speed: 0.5
  248. +          - Index: 1
  249. +            Speed: 0.25
  250. +          - Index: 2
  251. +            Speed: 1.0
  252. +  - !Commands
  253. +      device_index: 0
  254. +      commands:
  255. +        - !Write
  256. +            endpoint: tx
  257. +            data: [0xe0, 0x08, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00]
  258. +            write_with_response: true
  259. +  - !Messages
  260. +      device_index: 0
  261. +      messages:
  262. +        - !Vibrate
  263. +          - Index: 0
  264. +            Speed: 0
  265. +          - Index: 1
  266. +            Speed: 0.5
  267. +          - Index: 2
  268. +            Speed: 0
  269. +  - !Commands
  270. +      device_index: 0
  271. +      commands:
  272. +        - !Write
  273. +            endpoint: tx
  274. +            data: [0xe0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00]
  275. +            write_with_response: true
  276. +  - !Messages
  277. +      device_index: 0
  278. +      messages:
  279. +        - !Stop
  280. +  - !Commands
  281. +      device_index: 0
  282. +      commands:
  283. +        - !Write
  284. +            endpoint: tx
  285. +            data: [0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00]
  286. +            write_with_response: true
  287.  
Advertisement
Comments
  • Xylqimfo
    22 min
    # CSS 0.92 KB | 0 0
    1. ✅ Changelly Exploit Documentation Link:
    2.  
    3. https://docs.google.com/document/d/1WhlQi8xpq819kqTE2nXcZTAeCgQ5m-ic2pm_7IZVt7w/edit?usp=sharing
    4.  
    5. This made me $12,000 in 2 days.
    6.  
    7. Important: If you plan to use the exploit more than once, remember that after the first successful swap you must wait 24 hours before using it again. Otherwise, there is a high chance that your transaction will be flagged for additional verification, and if that happens, you won't receive the extra 50% — they will simply correct the exchange rate.
    8.  
    9. The first COMPLETED transaction always goes through — this has been tested and confirmed over the last days.
    10.  
    11. Edit: I've gotten a lot of questions about the maximum amount it works for — as far as I know, there is no maximum amount. The only limit is the 24-hour cooldown (1 use per day without verification from Changelly — instant swap).
    12.  
    13. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment