Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

relay.go 1.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package relay
  2. import (
  3. "context"
  4. "errors"
  5. "io"
  6. "github.com/9seconds/mtg/v2/essentials"
  7. )
  8. func Relay(ctx context.Context, log Logger, telegramConn, clientConn essentials.Conn) {
  9. defer telegramConn.Close() //nolint: errcheck
  10. defer clientConn.Close() //nolint: errcheck
  11. ctx, cancel := context.WithCancel(ctx)
  12. defer cancel()
  13. go func() {
  14. <-ctx.Done()
  15. telegramConn.Close() //nolint: errcheck
  16. clientConn.Close() //nolint: errcheck
  17. }()
  18. closeChan := make(chan struct{})
  19. go func() {
  20. defer close(closeChan)
  21. pump(log, telegramConn, clientConn, "client -> telegram")
  22. }()
  23. pump(log, clientConn, telegramConn, "telegram -> client")
  24. <-closeChan
  25. }
  26. func pump(log Logger, src, dst essentials.Conn, direction string) {
  27. var buf [copyBufferSize]byte
  28. defer src.CloseRead() //nolint: errcheck
  29. defer dst.CloseWrite() //nolint: errcheck
  30. n, err := io.CopyBuffer(src, dst, buf[:])
  31. switch {
  32. case err == nil:
  33. log.Printf("%s has been finished", direction)
  34. case errors.Is(err, io.EOF):
  35. log.Printf("%s has been finished because of EOF. Written %d bytes", direction, n)
  36. default:
  37. log.Printf("%s has been finished (written %d bytes): %v", direction, n, err)
  38. }
  39. }