Commit graph

438 commits

Author SHA1 Message Date
b047a90271 channels: drop stale membership caches on join/leave
After channels.leaveChannel, a client that polls channels.getFullChannel kept
receiving a projection that still showed it as an active member (left=false)
until the per-(viewer,channel) RPC projection cache and the store-level member
cache lapsed on their own or the async read-model NOTIFY landed. The client
therefore kept an open compose box while every send was already rejected with
CHANNEL_PRIVATE - most visible on public forum supergroups, where getFullChannel
keeps succeeding via the preview path instead of tearing the chat down.

Every other membership-mutating path already busts these caches synchronously;
join/leave/invite/request-approval did not. Add:

- store: invalidateChannelMembershipCaches (row + member + dialog caches),
  called post-commit from JoinChannel, LeaveChannel, ImportInvite,
  InviteToChannel.
- rpc: invalidateChannelMembershipProjection (channelFullProjectionCache pair),
  called from the join/leave/invite/hide-requests handlers for every user whose
  membership changed.
2026-09-14 11:58:11 +01:00
012f8a8d0e channels: force pre-history visible when a group gets a public username
New supergroups are created with "chat history for new members" hidden (the
client sets this right after creation, matching official Telegram). The
official server then forces it back to visible when the group is made public;
owpengram's UpdateUsername left the flag alone, leaving public groups in a
state where non-members (and post-join members) see no history at all.

UpdateUsername now clears pre_history_hidden whenever a non-empty username is
assigned, in the same transaction, with a matching admin-log event. Removing
the username leaves the flag untouched, so the creator can hide history again
once the group is private.
2026-09-14 11:57:12 +01:00
eb7cdd1a77 channels: give getParticipants a stable Hash when read-model versions are missing
cachedParticipants returned a participant page with Hash=0 whenever the
channel_base / channel_participants rows in read_model_versions were never
seeded for a channel (e.g. groups created via messages.createChat). With
Hash=0 the RPC layer can never answer channels.channelParticipantsNotModified,
so a client that polls the member list re-fetches it in a tight loop forever.

Fall back to a deterministic content hash derived from the page itself
(channel id, page key, count, and each member's id/role/status/rank) so an
unchanged member list yields an identical non-zero Hash and the client
converges. The read-model-backed path is unchanged.
2026-09-14 11:55:23 +01:00
c7a77c23c8 forum: fix reply_to_top_id for replies inside a forum
resolveChannelReply applied discussion-thread logic (reply_to_top_id =
the replied-to message's own id) to forum replies. Replying to a General
message produced reply_to_top_id = <that id>, a topic no client can
resolve: the reply vanished from every topic view and reply-jump on
strict clients said "message doesn't exist".

Forum replies now inherit the target's topic via domain.ForumReplyTopicID
(target's topic, or its own id if it's a topic-create, else General), and
General (topic 1) is accepted as a valid virtual topic everywhere, so
sends carrying top_msg_id: 1 are no longer rejected. Non-forum discussion
threads are unchanged.
2026-09-14 11:55:23 +01:00
f0bf315bf3 forum: let non-members browse a public forum's topic list
ListForumTopics / GetForumTopicsByID / GeneralForumTopic gated on
membership while channel history uses the public-preview path, so a
public forum's topics (General included) were invisible until you joined.
Switch them to getChannelForViewer / channelForViewerLocked; private
forums and write paths keep the membership gate.
2026-09-14 11:55:23 +01:00
57b7829a9e media: never project zero image/video dimensions (crashes Telegram Desktop on reactions) 2026-09-14 11:55:23 +01:00
d4fe056854 welcome message: link @zio with a mention entity 2026-09-14 11:55:23 +01:00
4d781a52bb payments: stub getStarGifts / getSavedStarGifts to stop tdesktop 500 retry storm 2026-09-14 11:53:43 +01:00
db3fbe6015 Containerfile: copy sticker-seed data into the image 2026-09-14 11:53:43 +01:00
5afafc60c4 /mybots: Edit Bot summary screen, return-to-menu, clickable @mentions
- Edit Bot now shows the current value of every field (Name/About/
  Description/Botpic/Commands) like BotFather, with real botpic status
  via a new PeerHasAvatar port method.
- After editing a field the dialog lands back on a fresh Edit Bot menu
  (working "Back to bot" / "Bots list" buttons) instead of ending, so a
  follow-up button press no longer reports the button as expired.
- Service-bot messages now render @username as a tappable mention entity.
2026-09-14 11:53:43 +01:00
f474a360d7 Interactive /mybots menu for @BotFather
Button-driven bot management: paginated picker, per-bot API token /
revoke, Edit Bot (name/description/about/commands/botpic), Bot Settings
toggles (inline/groups/privacy), and delete. Navigation edits the menu
message in place via a new editServiceBotMessage helper.

Edit Botpic accepts a photo the user sends to @BotFather and sets it as
the bot's profile photo (new files.SetAvatarFromExistingPhoto, wired
through bots.SetBotUserpic / WithBotAvatarStore); photos.uploadProfilePhoto
does not accept a bot target so this is the only route.
2026-09-14 11:52:52 +01:00
196f90f9b1 Add Containerfile and .containerignore 2026-09-14 11:52:52 +01:00
09e2d24a4a Don't 500 on channel sends with an unresolvable @mention
A channel post containing an @token that is not a syntactically valid
username (too short, leading digit, etc.) made messages.sendMessage return
500 INTERNAL_SERVER_ERROR: mentionedUserIDsFromMessage turned every
ResolveUsername error into internalErr().

Skip tokens that fail with ErrUsernameInvalid / ErrUsernameNotOccupied
instead, matching real Telegram (the message sends, the client renders the
mention and only fails to open it on tap). Only unexpected storage errors
still abort. Same fix applied to the bot send path.
2026-09-14 11:52:52 +01:00
onysd128
4e148052b6
Create FUNDING.yml 2026-09-13 08:44:23 +03:00
onysd
d8d6788a1c fixed script install 2026-09-13 05:11:34 +03:00
onysd
cd59cd8d28 fix for minio docker image 2026-09-13 02:56:39 +03:00
onysd
e4debd6b7d linux server installer quickfix 2026-09-13 02:02:19 +03:00
onysd
22b308483d updated readme 2026-09-12 19:45:47 +03:00
onysd
7c0639cf6a fix for comments in groups 2026-09-12 19:14:53 +03:00
onysd
93e5d4229d fix 2026-09-11 18:50:20 +03:00
onysd
a98c0beffc fix 2026-09-11 18:44:49 +03:00
onysd
559769af88 fix 2026-09-11 18:25:08 +03:00
onysd
6d026e16f2 fix 2026-09-11 17:23:42 +03:00
onysd
27c8e9a434 fix 2026-09-11 17:21:44 +03:00
onysd
03de33c418 fix 2026-09-11 16:59:32 +03:00
onysd
4224b9d15c updated server install scripts 2026-09-11 16:19:13 +03:00
onysd
7ad68c3983 added full access row to operator modal, plus a test for the last-manager guard
The "*" wildcard was never in assignablePermissions, so an operator holding it
(the one the first-run wizard creates) showed every box unticked while having
every right, and there was no way to take it away. Its own row fixes both; the
grid is disabled while it is on, since normalisePermissions collapses "*" plus
anything back to "*".

That made guardManagerRemoval reachable from the UI for the first time, so it
now has an integration test covering the wildcard match and the enabled filter
in its SQL.
2026-09-11 15:48:07 +03:00
onysd
c04a8ddc6a added bot api question on wev-setup 2026-09-11 05:15:00 +03:00
onysd
2f1818d656 merged with fixes 2026-09-09 02:49:30 +03:00
onysd
a9e758b712 update gitignire 2026-09-08 21:25:11 +03:00
onysd
274bdc8bac fixing bugs 2026-09-08 18:59:58 +03:00
onysd
979d27ec7a improvements for first-time setup 2026-09-08 17:56:26 +03:00
onysd
e59d85cf57 made scripts just an easy startup and first setup over web admin page 2026-09-08 15:18:19 +03:00
onysd
7b788408b9 adjusted login form sizes and fixed routing issues after login 2026-09-08 13:52:39 +03:00
onysd
d5eb77e2d6 removed useless text on login form 2026-09-08 13:44:04 +03:00
onysd
2584380a80 glorifying login page 2026-09-08 13:40:48 +03:00
onysd
e240bfbbfa added dry run for update button 2026-09-08 13:25:00 +03:00
onysd
5c16371ae0 added cache for dashboard and storage pages 2026-09-08 02:29:28 +03:00
onysd
eb69c8500c now left menu in admin panel can be minimized 2026-09-08 02:24:58 +03:00
onysd
db40f100cd added 403 screen when operator have no permission for section 2026-09-08 02:19:09 +03:00
onysd
f7b3af48de added background to panel itself 2026-09-08 02:02:18 +03:00
onysd
87173ae43f glorifying admin panel 2026-09-08 01:53:49 +03:00
onysd
ae2cc3ba90 messages screen improvement 2026-09-08 01:19:33 +03:00
onysd
280321b902 server admin panel is now supports multiple operators profiles 2026-09-08 01:01:35 +03:00
onysd
e48160ac3a fix for query 2026-09-07 18:57:42 +03:00
onysd
5f94d3e028 fixes for parallel info loading for admin panel 2026-09-07 18:52:51 +03:00
onysd
62849c532e added skeletons to admin page when data on dashboard and storage page are loading 2026-09-07 18:40:56 +03:00
onysd
87cebec9bd fix for muting an account 2026-09-07 09:31:06 +03:00
onysd
aeaf3f4596 updates for server files size limits 2026-09-06 07:14:50 +03:00
onysd
b65ad60fe8 fix for deleted file metadata 2026-09-03 11:00:50 +03:00