Default avatar
npub1ahck...7v97
npub1ahck...7v97
Scan QR code from static image (#1550) This PR allows users to open the link in a QR Code if it exists. Detects if there is a qr code and extracts that info, if it is an lnurl it'll append the lightning prefix so it can be opened by a lightning wallet. If it is a regular link it'll open a dialog to ask the user if they want to open the link, with the link displayed. If there is no link it show a dialog that says no qr code found. See these notes for video examples: scan-image-qr, 1 commits
[#1530] Create new controls UI for video playback (#1537) Addresses #1530 Create a new controls UI layer for the DamusVideoPlayer, providing play/pause, volume control, content scale, playback rate controls, as well as a seek/timecode bar. <img width="594" alt="Screenshot 2023-09-05 at 11 42 46" src="https://github.com/damus-io/damus/assets/1031501/de89196e-0951-4a59-8430-99a8cd166e60"> <img width="586" alt="Screenshot 2023-09-05 at 11 42 55" src="https://github.com/damus-io/damus/assets/1031501/4a947870-640d-4c7e-89f7-1eab30326aa3"> Current features: - Scrub on the horizontal seek bar to change the playback time - Play/Pause button - Mute/Unmute button and volume vertical slider - Select playback rate from 0.5x up to 2.0x - Tap video to hide/show controls - Player has option to hide controls on startup - Player's video tap behavior can be customized Fixes: - The VideoPlayer has been reworked from frame-by-frame updating to an event-driven model, significantly improving performance and understandability. Known Issues: - This still suffers from [#1386] as that is a navigation/data model architecture issue, not specific to the video player. Note: - This feature DOES NOT INCLUDE A FIX FOR #1386 ! That fix will be provided in a future PR. Bounty: 100k satoshis(BTC) -> 0.001 BTC Payout Address: `bc1q5sxugecyhq5stxn4d79p4908hdr7ljcn35uyk7` <img width="341" alt="btc001" src="https://github.com/damus-io/damus/assets/1031501/54552b4f-ad4e-4842-b1a2-2ac44bf47ad7"> issue/1530-video-controls, 2 commits
Profiles in nostrdb (#1520) This adds profiles to nostrdb and replaces our in-memory and ProfileDatabase cache with it - Remove in-memory Profiles caches, nostrdb is as fast as an in-memory cache - Remove ProfileDatabase and just use nostrdb directly ## TODO - [ ] cache lnurl properly - [ ] add database versions for migrations nostrdb-profiles, 5 commits
Move the Block helper type to its own file (#1496) Move the Block helper type to its own file, collapse the various standalone functions for parsing block data, and refactor consumers to initialize a Block with given data and access its members as needed. This is a more "idiomatic" approach to these C-backed data structures, and moves a number of these functions, extensions, and types into `fileprivate` scope, removing them from the global symbols and generally cleaning up their interface and usage. I plan to continue these "cleanup and refactor" changes as I learn more about the repository. refactor/block-initializer, 1 commits
Adding zap icon to Eurothon hashtag (#1477) Adding the Zap ⚡️ icon to the Eurothon hashtag. I created a new property for Eurothon. I'm using the same svg icon file, just like the Zapathon hashtag. I couldn't test it because I don't have a macOS environment. Issue: #1474 eurothon-zap, 1 commits
Fixing counting -1 (#1473) Fix for issue #1467 The 'others' count is higher than pubkeys count Note json : `{ "pubkey": "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", "content": "No, just so other people can hear and profit, that's the point of the podcast. But I see you're PNW too, coffee also works if we end up in the same vicinity!", "id": "2c271f78da9522a342f6178667e4dd30423cab65a559f1fd683071d130fc3477", "created_at": 1691611954, "sig": "de62016ad6260180f9f99b83773066c60db63790560e3bd6239995e26526d647a2776469f6de0855bd9deab8d2a42c1fcddd275b07f7b5924bb0d4a922f486e3", "kind": 1, "tags": [ [ "p", "61066504617ee79387021e18c89fb79d1ddbc3e7bff19cf2298f40466f8715e9", "wss:\\/\\/anon.computer", "atyh" ], [ "e", "b7f986c892a0f128c131ab90996fcb94fac2c80869cb88a5d021e0b2f3609045", "wss:\\/\\/offchain.pub", "root" ], [ "e", "ad8d909a66d848a6101d7482245f484c86e3d6597fcec19921e1cc0f5b6e94fb" ], [ "e", "18ebd3e8f86bf3f318ed0a71e3853855bde59f3be433e37a958b33be8273f8e6", "wss:\\/\\/offchain.pub", "reply" ], [ "client", "coracle" ] ] }` replay-counting-fix, 1 commits
Add nip 98 support for nostr.build (#1471) This change implements support for NIP-98 and uses it for uploads to nostr.build. It is also changing the nostr.build API end-point to V2. Implements #823 add-nip-98-support-nostr-build, 7 commits
[UX] Fix Issue 1238: Videos sounds can play over each other (#1266) Fix issue #1238 This is a Draft - current solution seems fairly robust - scroll away & video stops; scroll back & it starts over - ...but still investigating potentially more robust solutions i.e. whether it could be more responsive / sensitive to scrolling away even at higher scroll speed (as in below demo) Demo video of current fix in this post: [~1 min. / 50MB] UX-DamusVideoPlayer--Fix-Issue-1238--Videos-sounds-can-play-over-each-other, 1 commits
add relay logging (#1263) This PR adds relay logging to the RelayDetailView. Features: * list of events, most recent at the top * shows changes to RelayConnection's state * shows changes to network state * RelayDetailView updates live as lines are added to the log * logs persisted to disk for later investigation * line limit prevents unbounded file growth Here's how it looks when resuming after having the app in the background for a while and the relays need to reconnect: ![relay-log](https://github.com/damus-io/damus/assets/445882/fd788aae-ed44-49c5-9dd1-4e6c7398456e) relays, 5 commits
NostrScript (#1246) NostrScript is a WebAssembly implementation that interacts with Damus. It enables dynamic scripting that can be used to power custom list views, enabling pluggable algorithms. The web has JavaScript, Damus has NostrScript. NostrScripts can be written in any language that compiles to WASM. This commit adds a WASM interpreter I've written as a mostly-single C file for portability and embeddability. In the future we could JIT-compile these for optimal performance if NostrScripts get large and complicated. For now an interpreter is simple enough for algorithm list view plugins. Changelog-Added: Add initial NostrScript implementation nostrscript, 1 commits
Giphy integration (#1142) Through the integration of the Giphy SDK, users gain a transformative ability to enrich their posts and replies with captivating GIF media files. Moreover, the integration of Giphy's extensive library of GIFs offers an endless array of visual content, allowing users to select the perfect expression to accompany their words. Whether it's a fleeting moment of joy, a burst of creativity, or a heartfelt sentiment, the availability of GIFs enhances the power of self-expression, making each interaction more personalized and memorable. Below is Youtube video link for showing Giphy work-flow in Damus giphy-integration, 2 commits
Migrate away from sticky deprecated non-pubkey-scoped settings (#1124) Changelog-Fixed: Migrate away from sticky deprecated non-pubkey-scoped settings This fixes a bug where older users of Damus who created another account could have OnlyZaps enabled even though the default is false. tyiu/unstick-settings, 1 commits
fix crash related to preloading events (#1115) This PR fixes the top crash in build 1.4.3(24): <img width="376" alt="damus_—_Profiles_swift" src="https://github.com/damus-io/damus/assets/445882/1cf51c52-920d-43a7-a832-0776790557d8"> The crash is caused by a data contention for the `profiles` dictionary in the `Profiles` class. Many views and view models access this dictionary from the main thread by calling `Profiles.lookup(id:)`. `Profiles.add(id:profile:)` is currently called only from the main thread. However, the stack trace in the crash report indicates that it happens when `Profiles.lookup(id:)` is called from a non-main thread during event preloading. When a profile is added on the main thread and a profile lookup occurs on a non-main thread at the same time, we have a data contention and the app crashes. To resolve this, I added a concurrent `DispatchQueue` to synchronize access to the `profiles` dictionary. Concurrent reads can happen safely from both main and non-main threads, but writes will happen asynchronously and use the `barrier` flag to enforce exclusive access. An alternative fix would be to make the `Profiles` class an `actor` instead of a `class`, which automatically synchronizes access to all of its members. I chose not to pursue this solution because it would also make `Profiles.lookup(id:)` `async`, which would change all the call sites. profiles-crash, 1 commits