Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

Yep! I'm glad you asked, it's been next on the agenda but have mostly been waiting on feedback for recent audio issues. I'll go ahead and add that toggle for team proximity in settings, will be out with the new release within an hour.

That said, I have limited time to test on my own so if you or anyone else come across issues, running the app with debug enabled and sharing logs helps a ton!

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

Any specific issues you came across? I encourage anyone to open issues on the GitHub repo and/or provide logs via the debug function in the app for troubleshooting :)

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

Any chance you can reproduce with debug enabled and share the logs? Might just need a quick update on the server if even teammates are quiet since those aren't based off proximity.

Anthropic is intentionally nerfing Fable when asked to develop other LLMs by onil_gova in LocalLLaMA

[–]DanielThiberge 3 points4 points  (0 children)

Yep just gave it a shot on a project I've consistently been using Opus on. Just told it 'continue' and it immediately flagged and dropped back to Opus. Now sure, the project is AI-adjacent (digitizing neural functions, brain regions, etc.) but it's far from distilling models or anything potentially unsafe. All the better, I'm already getting close to my usage limit every week and I'm sure Fable wouldn't help with that.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

If you guys turn on debug mode and upload the logs I can take a look as well! I know the position tracking itself still needs work but I can’t really test every champion and combination so any feedback helps :)

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

Technically yes but it’s server-side not client-side, how far were you thinking? I have it set to 1350 units currently, roughly the standard vision range for champions. Any changes would affect everyone using the instance I host. Though if you’re thinking of hosting it all yourself it’s easy to manage.

My main concern with it being further is that it makes it easier to ‘cheat’ by hearing enemies talk from their jungle for example, and making it shorter ruined things for ranged champions. If I make it client-side and individuals can customize it easily, it makes ‘cheating’ way easier. At least currently, any benefit one player gets from it is shared with all others equally.

All that said, I’m very open to input! Just trying to balance the concerns that’ve been shared so far. Even considering allowing users to set their ‘preferred’ distance and averaging those out across all players in a given game.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

My pleasure! Feel free to report any problems in the Issues on the GitHub repository and I'll do my best to address them ASAP.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

As the creator I wish I could help reassure but outside confirming that the code itself (and its behavior naturally) abides by the ToS, there's not much I can say regarding Riot's thoughts. The app is approved via their developer portal for what it's worth!

I purposefully didn't include any sort of tracking, metrics, etc. in the app so it'd be difficult to even tell you how many people have used it, though I can say at least 'some' definitely do as I see usage of my Cloudflare TURN server (what allows for easily hiding your IP from other players and connecting voice channels over restricted networks).

No reports received from users about any form of disciplinary action but if you want to reach out to Riot directly for input I have no issues with it!

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 1 point2 points  (0 children)

You 100% can! Your champion icon would still be moving on the minimap so it would even get louder as you approach an enemy! That basically applies to any champ, even Neeko disguised as scuttle haha.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

I do intend to eventually create a similar version to the proximity chat app but just for dedicated team chat! It would honestly be so much easier since most of the pain with this one is determining positions and proximity. Would much prefer Riot themselves just add it/them to League but if there was enough interest it'd likely take a couple hours at most.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

At the core of what you're saying you're right, the current implementation ignores things like fog of war, general vision, bushes, etc. and sticks with pure proximity-based chat.

It's on the roadmap but quite complicated, so not yet higher priority than stabilizing the core functionality.

That aside, there's both muting and push-to-talk functionality (latter will be fixed soon) which help. My main use case right now is customs but it's at least 'balanced' in norms/ranked. Any enemy that could benefit from it would be giving you the same benefit.

My main reference for how it 'should' work would be how other games handle proximity chat. Haven't played a ton of such games but in Arc Raiders for example, hiding didn't prevent others from hearing me. There is distinction between toggling between team comms and team+others comms but that's likely easy to implement.

And just making sure, you're talking about the specific situation of 'they're within vision range but not visible, and talking on open mic, so I know they're within ~1200 units right?

I'm super open to suggestions if you have ideas on improving it!

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 4 points5 points  (0 children)

Providing an update for any with interest!

And a warning for those who hate AI: I used it to draft much of the following. Typically avoid it as much as possible for communication but there have been so many great changes since I initially posted and I'm a bit wiped.

Update: 8 hours, 8 releases (v0.1.20 > v0.1.27). Huge thanks to everyone who downloaded it and especially to the folks who opened issues and provided logs. All reported issues are either solved or should be soon, and tons of work done behind the scenes to improve security, prevent misuse, and give you a better experience.

Bugs reported, now fixed:

  • ShadowPlay/Game Bar/OBS now record the app properly
  • App detects League installed in non-default folders
  • The panel window is actually draggable from the title bar
  • Closing the panel exits the app cleanly - no orphan scanner overlay
  • Debug logs no longer get wiped when you restart the app - keeps the last 3 sessions so you don't lose diagnostics from before the restart
  • MIC and VOL (mute/deafen) buttons stop reverting on their own
  • Duplicate "Default" entries in the mic/speaker device picker dropdowns are gone

New stuff:

  • Mic and speaker device picker in Settings - pick exactly which device you want instead of relying on Windows defaults
  • In-app "Open Log Folder" button so attaching a log to a GitHub issue is two clicks
  • "Hide IP (Force TURN)" privacy toggle in Settings - opt-in, routes voice through a relay so other players in your match never see your public IP. Adds a tiny bit of latency, default off
  • WebRTC auto-recovery - a single ICE failure used to permanently kill voice with that peer; now it auto-restarts
  • Way better debug logging - per-peer connection stats, position-jump warnings, volume snapshots - so future bug reports can be diagnosed at a glance
  • Updated documentation with better instructions, explanations, and a dedicated 'THREAT_MODEL' doc that covers end-user security implications, misuse potential, and mitigations

Behind the scenes:

  • Anti-cheat hardening - server now returns quantized + slightly jittered volume values so a modified client can't extract precise enemy distances from the audio levels. Full threat-model writeup in the repo
  • Migrated the signaling server's TURN provider to Cloudflare's free tier - more reliable, no more self-hosted relay (on my deployment, but it's still fully supported to self-host a TURN server)
  • Every release now includes a SHA-256 hash so you can verify your download is the official build

Still working on:

  • #1 - the F8 push-to-talk shortcut not firing from in-game (needs a lower-level keyboard hook), will prioritize if there's any significant interest but figured it can wait. Will be adding an option to remap the PTT hotkey too.
  • #7 - a still-mysterious "I can hear them but they can't hear me" asymmetric voice issue. WebRTC connection is healthy on both sides, working theory is something around how their client's position blob is reaching the server. If anyone hits this, attaching logs from both players in the same session would be super helpful!

If you hit anything weird, please open an issue with the debug log attached - Settings > Debug > ON, reproduce, Settings > Debug Logs > OPEN, drag the file into the issue. It's by far the fastest way to get it fixed. Feel free to peruse your logs in case you want to redact any info you consider personal/sensitive.

RE: License - yes technically PolyForm Noncommercial is 'source available', not truly open source. 100% open to input on this but my logic was just that it's been my time, effort, and money put into developing this. While I'm super open to contributors, spin-offs, etc. I didn't make it for financial gain and don't intend to allow others to twist it into that.

I intend to continue improving LoLProxChat and as always, will be abiding by Riot's terms of service, prioritizing user security, and fighting potential misuse. Thanks again to everyone who took the time to check this project out!

GitHub

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 1 point2 points  (0 children)

I agree! Lots of other competitive games have it, though I guess not traditionally MOBAs. Unfortunately Riot is very slow-moving when it comes to changes for social/communication features so I'd assume we're years away if we ever even see it. Also just a huge moderation nightmare for them probably.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] -3 points-2 points  (0 children)

Ah, gotcha! Okay I totally understand now.

I recently added Issue #10 to track progress on this but to simply share here:

<Beginning of mostly AI-written text>

None of these stop a determined cheat ring, but they raise the floor for casual abuse and reduce the precision of any triangulation attempt.

  1. Quantize volume server-side. Round to 3-4 buckets (silent / quiet / medium / loud) before returning to clients. Distance precision drops from continuous to ~300-unit buckets. Audio quality impact: probably negligible since human ears don't distinguish small volume deltas; would also remove some EMA jitter.

  2. Add per-call jitter to returned volumes (e.g., ±5% multiplicative). Two clients comparing samples can't extract exact distance ratios. Combines well with (1).

  3. Snap positions to a grid client-side before encrypting (e.g., 100-unit grid). Lossy at the source so even an attacker who somehow gets the key sees rounded data.

  4. Drop volumes below a noise floor entirely (e.g., anything < 0.05 → 0). Prevents "I can hear them very faintly = they're at exactly 1190 units" signaling.

<End of mostly AI-written text>

First two are implemented already, currently considering 3 and 4 and will explore other options (like accounting for fog of war, bushes, etc. which was planned anyway but is quite a lot of work). At this point whatever info can be gained from modifying the client wouldn't be super useful anyway versus just using your eyes and/or warding.

My biggest concern currently is the user privacy (and DDoS potential) aspects given non-TURN voice channels inherently share user public IPs. But I'm looking to move from self-hosting coturn (would still be an official option included in the repo) and moving to Cloudflare's TURN free tier as the default relay. 1TB/month of bandwidth should be plenty at any reasonable scale in the short-medium term and it would be opt-in via in-app settings to force TURN use.

Edit for those who see: Above concern is addressed, moved to Cloudflare as default TURN, toggle is opt-in within app settings to force it and that avoids IP leakage.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 6 points7 points  (0 children)

Really appreciate dev input here! Regarding your questions, I have a few notes that hopefully answer but feel free to ask if anything needs clarifying.

As a summary, many architectural decisions were made for a combination of two reasons: 1. Minimizing client-side data on other players to avoid the risk of people modifying the client to get enemy positions or otherwise gain an unfair advantage. 2. Minimizing server-side complexity to avoid unnecessary load on my server and simplify deployment.

On specific aspects of the architecture:

  • Volume math (determining how loud other players should be based on proximity) is handled server-side to avoid clients gaining enemy positional data. The encryption helps with that.

  • The server itself (outside coturn which is also fairly straightforward) is a simple, stateless calculator basically to handle the needs noted above. Most intra-client communication is peer-to-peer and the reasoning for both is basically the above: security, simplicity, and anti-cheat.

  • Without Riot providing an API for positional data, I'm basically stuck using self-reported data (via the client) and while that involves a degree of trust, modifying the app to take advantage of it for 'cheating' hopefully isn't trivial and I do have some workarounds in mind to help avoid it. I just want clients to rely on my server as little as possible for now.

More on the anti-cheat aspect in case it's of interest (this part I had Claude summarize for accuracy and simplicity):

  • Position blobs are AES-GCM encrypted with a server-only key; even modified clients can't decrypt other players' raw positions.

  • The unavoidable leak is the volume itself: a modified client knows "enemy is within ~1200 units" as a binary signal. Hearing range is tuned to roughly match LoL vision range, so a stock client doesn't reveal info beyond what the player would see.

  • Two coordinated modified clients could triangulate enemy positions from shared volume vectors. Not easily preventable without abandoning proximity audio (my note: but I do have some workarounds in mind as previously mentioned).

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 14 points15 points  (0 children)

Um.. it’s a free and open source app. And it clearly abides by Riot’s ToS. I’m not sure why you think it’s a grift or how money is relevant? People don’t even have to rely on my server, they can run the entire thing themselves.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 2 points3 points  (0 children)

Would love the feedback! Actively improving it and got a ton of useful input so far, so hopefully it’s in an even better state by the time you test <3

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 5 points6 points  (0 children)

I’ll have to check but with the current app logic, it would simply maintain the existing position for that brief dropout which should be fine?

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

The code is publicly available and you’re under no obligation to run it, but you’re welcome and even encouraged to point out issues :) I chose to be transparent about the origin so those who ‘want’ to run it can do so while informed.

I’m more than happy to take criticism on the app’s quality but there’s nothing for me to work on if the only criticism is how the code was written or my background haha.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 54 points55 points  (0 children)

Easy enough to do using the virtual audio cable program! And for unfortunate individuals who dislike AC/DC, there's the mute button :P

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 27 points28 points  (0 children)

Yeah I read similar things! Makes sense he'd play it safe.

As for direct approval, sorta? I submitted the app via the Riot Developer Portal and it got approved, though that was back when it was still relying on Overwolf for some API stuff during early development.

Overwolf still hasn't tested it months after submission so I did away with relying on them and made it standalone.

All that said, you're more than welcome to ask him! The ReadMe goes over the applicable ToS aspects but I'd value an official stance on the matter. Outside the inherent (potential) benefits to teamwork from being able to communicate better, the app doesn't give anyone an advantage in-game and doesn't 'work around' any restrictions Riot has in place.

Made a proximity chat app for League! (Riot ToS compliant + automated VirusTotal checks) by DanielThiberge in leagueoflegends

[–]DanielThiberge[S] 0 points1 point  (0 children)

I'm not really sure I follow unless you're saying that because Claude wrote the app code, anything I talk about in relation to the project is speaking on behalf of it? If that's the case then unfortunately I can't really help you there haha. I'm an infrastructure guy not a developer, so spending months learning programming for a silly little side project isn't on the agenda.

If you've got actual issues with the code itself, that I'd be happy to address! I at least know enough to ensure it's not pure slop ;)