Merge 4747a6ddfc420bafa9dbd75c0f3a95ebbc3e9e82 into 4b0f6f35394c6d69ba1b76c2a2ce1323e74acae1

This commit is contained in:
Alex B. 2026-10-22 13:47:05 +03:00 committed by GitHub
commit 8287b16f20
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 182 additions and 0 deletions

View File

@ -75,6 +75,10 @@ type ChangeGroupAdminsRequest struct {
Admins []string `json:"admins"`
}
type JoinGroupByLinkRequest struct {
Uri string `json:"uri"`
}
type LoggingConfiguration struct {
Level string `json:"Level"`
}
@ -1739,6 +1743,47 @@ func (a *Api) JoinGroup(c *gin.Context) {
c.Status(http.StatusNoContent)
}
// @Summary Join a Signal Group via an invitation link.
// @Tags Groups
// @Description Join a Signal Group using an invitation link. The uri starts with https://signal.group/#
// @Accept json
// @Produce json
// @Success 204 {string} OK
// @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number"
// @Param data body JoinGroupByLinkRequest true "Invitation link"
// @Router /v1/groups/{number}/join [post]
func (a *Api) JoinGroupByLink(c *gin.Context) {
number, err := url.PathUnescape(c.Param("number"))
if err != nil {
c.JSON(400, Error{Msg: "Couldn't process request - malformed number"})
return
}
if number == "" {
c.JSON(400, Error{Msg: "Couldn't process request - number missing"})
return
}
var req JoinGroupByLinkRequest
err = c.BindJSON(&req)
if err != nil {
c.JSON(400, Error{Msg: "Couldn't process request - invalid request"})
return
}
if req.Uri == "" {
c.JSON(400, Error{Msg: "Couldn't process request - uri missing"})
return
}
err = a.signalClient.JoinGroupByLink(number, req.Uri)
if err != nil {
c.JSON(400, Error{Msg: err.Error()})
return
}
c.Status(http.StatusNoContent)
}
// @Summary Quit a Signal Group.
// @Tags Groups
// @Description Quit the specified Signal Group.

View File

@ -2063,6 +2063,26 @@ func (s *SignalClient) JoinGroup(number string, groupId string) error {
return err
}
func (s *SignalClient) JoinGroupByLink(number string, uri string) error {
var err error
var jsonRpc2Client *JsonRpc2Client
if s.signalCliMode == JsonRpc {
type Request struct {
Uri string `json:"uri"`
}
request := Request{Uri: uri}
jsonRpc2Client, err = s.getJsonRpc2Client()
if err != nil {
return err
}
_, err = jsonRpc2Client.getRaw("joinGroup", &number, request)
} else {
cmd := []string{"--config", s.signalCliConfig, "-a", number, "joinGroup", "--uri", uri}
_, err = s.cliClient.Execute(true, cmd, "")
}
return err
}
func (s *SignalClient) QuitGroup(number string, groupId string) error {
var err error
var jsonRpc2Client *JsonRpc2Client

View File

@ -208,6 +208,17 @@ const docTemplate = `{
],
"type": "object"
},
"api.JoinGroupByLinkRequest": {
"properties": {
"uri": {
"type": "string"
}
},
"required": [
"uri"
],
"type": "object"
},
"api.LoggingConfiguration": {
"properties": {
"Level": {
@ -3410,6 +3421,53 @@ const docTemplate = `{
]
}
},
"/v1/groups/{number}/join": {
"post": {
"consumes": [
"application/json"
],
"description": "Join a Signal Group using an invitation link. The uri starts with https://signal.group/#",
"parameters": [
{
"description": "Registered Phone Number",
"in": "path",
"name": "number",
"required": true,
"type": "string"
},
{
"description": "Invitation link",
"in": "body",
"name": "data",
"required": true,
"schema": {
"$ref": "#/definitions/api.JoinGroupByLinkRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"204": {
"description": "No Content",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
},
"summary": "Join a Signal Group via an invitation link.",
"tags": [
"Groups"
]
}
},
"/v1/groups/{number}/{groupid}": {
"delete": {
"consumes": [

View File

@ -203,6 +203,17 @@
],
"type": "object"
},
"api.JoinGroupByLinkRequest": {
"properties": {
"uri": {
"type": "string"
}
},
"required": [
"uri"
],
"type": "object"
},
"api.LoggingConfiguration": {
"properties": {
"Level": {
@ -3405,6 +3416,53 @@
]
}
},
"/v1/groups/{number}/join": {
"post": {
"consumes": [
"application/json"
],
"description": "Join a Signal Group using an invitation link. The uri starts with https://signal.group/#",
"parameters": [
{
"description": "Registered Phone Number",
"in": "path",
"name": "number",
"required": true,
"type": "string"
},
{
"description": "Invitation link",
"in": "body",
"name": "data",
"required": true,
"schema": {
"$ref": "#/definitions/api.JoinGroupByLinkRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"204": {
"description": "No Content",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
},
"summary": "Join a Signal Group via an invitation link.",
"tags": [
"Groups"
]
}
},
"/v1/groups/{number}/{groupid}": {
"delete": {
"consumes": [

View File

@ -232,6 +232,7 @@ func main() {
groups.DELETE(":number/:groupid", api.DeleteGroup)
groups.POST(":number/:groupid/block", api.BlockGroup)
groups.POST(":number/:groupid/join", api.JoinGroup)
groups.POST(":number/join", api.JoinGroupByLink)
groups.POST(":number/:groupid/quit", api.QuitGroup)
groups.PUT(":number/:groupid", api.UpdateGroup)
groups.POST(":number/:groupid/members", api.AddMembersToGroup)