Administration tools, this resolves #43.

pull/108/head
Ian Byrd 7 years ago
parent 6b0a36e491
commit 091bbc9a13

@ -0,0 +1,139 @@
package telebot
import (
"strconv"
"time"
)
// Rights is a list of privileges available to chat members.
type Rights struct {
CanBeEdited bool `json:"can_be_edited,omitempty"` // 1
CanChangeInfo bool `json:"can_change_info,omitempty"` // 2
CanPostMessages bool `json:"can_post_messages,omitempty"` // 3
CanEditMessages bool `json:"can_edit_messages,omitempty"` // 4
CanDeleteMessages bool `json:"can_delete_messages,omitempty"` // 5
CanInviteUsers bool `json:"can_invite_users,omitempty"` // 6
CanRestrictMembers bool `json:"can_restrict_members,omitempty"` // 7
CanPinMessages bool `json:"can_pin_messages,omitempty"` // 8
CanPromoteMembers bool `json:"can_promote_members,omitempty"` // 9
CanSendMessages bool `json:"can_send_messages,omitempty"` // 10
CanSendMedia bool `json:"can_send_media_messages,omitempty"` // 11
CanSendOther bool `json:"can_send_other_messages,omitempty"` // 12
CanAddPreviews bool `json:"can_add_web_page_previews,omitempty"` // 13
}
// NoRights is the default Rights{}
func NoRights() Rights { return Rights{} }
// NoRestrictions should be used when un-restricting or
// un-promoting user.
//
// member.Rights = NoRestrictions()
// bot.Restrict(chat, member)
//
func NoRestrictions() Rights {
return Rights{
true, false, false, false, false, // 1-5
false, false, false, false, true, // 6-10
true, true, true}
}
// AdminRights could be used to promote user to admin.
func AdminRights() Rights {
return Rights{
true, true, true, true, true, // 1-5
true, true, true, true, true, // 6-10
true, true, true} // 11-13
}
// Forever is a Unixtime of "forever" banning.
func Forever() int64 {
return time.Now().Add(367 * 24 * time.Hour).Unix()
}
// Ban will ban user from chat until `member.RestrictedUntil`.
func (b *Bot) Ban(chat *Chat, member *ChatMember) error {
params := map[string]string{
"chat_id": chat.Recipient(),
"user_id": member.User.Recipient(),
"until_date": strconv.FormatInt(member.RestrictedUntil, 10),
}
respJSON, err := b.sendCommand("kickChatMember", params)
if err != nil {
return err
}
return extractOkResponse(respJSON)
}
// Unban will unban user from chat, who would have thought eh?
func (b *Bot) Unban(chat *Chat, user *User) error {
params := map[string]string{
"chat_id": chat.Recipient(),
"user_id": user.Recipient(),
}
respJSON, err := b.sendCommand("unbanChatMember", params)
if err != nil {
return err
}
return extractOkResponse(respJSON)
}
// Restrict let's you restrict a subset of member's rights until
// member.RestrictedUntil, such as:
//
// * can send messages
// * can send media
// * can send other
// * can add web page previews
//
func (b *Bot) Restrict(chat *Chat, member *ChatMember) error {
prv, until := member.Rights, member.RestrictedUntil
params := map[string]string{
"chat_id": chat.Recipient(),
"user_id": member.User.Recipient(),
"until_date": strconv.FormatInt(until, 10),
}
embedRights(params, prv)
respJSON, err := b.sendCommand("restrictChatMember", params)
if err != nil {
return err
}
return extractOkResponse(respJSON)
}
// Promote lets you update member's admin rights, such as:
//
// * can change info
// * can post messages
// * can edit messages
// * can delete messages
// * can invite users
// * can restrict members
// * can pin messages
// * can promote members
//
func (b *Bot) Promote(chat *Chat, member *ChatMember) error {
prv := member.Rights
params := map[string]string{
"chat_id": chat.Recipient(),
"user_id": member.User.Recipient(),
}
embedRights(params, prv)
respJSON, err := b.sendCommand("promoteChatMember", params)
if err != nil {
return err
}
return extractOkResponse(respJSON)
}

@ -336,7 +336,7 @@ func (b *Bot) Delete(message Editable) error {
return extractOkResponse(respJSON)
}
// SendChatAction updates a chat action for recipient.
// Action updates a chat action for recipient.
//
// Chat action is a status message that recipient would see where
// you typically see "Harry is typing" status message. The only
@ -345,7 +345,7 @@ func (b *Bot) Delete(message Editable) error {
//
// Currently, Telegram supports only a narrow range of possible
// actions, these are aligned as constants of this package.
func (b *Bot) SendChatAction(recipient Recipient, action ChatAction) error {
func (b *Bot) Action(recipient Recipient, action ChatAction) error {
params := map[string]string{
"chat_id": recipient.Recipient(),
"action": string(action),
@ -421,10 +421,10 @@ func (b *Bot) FileByID(fileID string) (File, error) {
return resp.Result, nil
}
// LeaveChat makes bot leave a group, supergroup or channel.
func (b *Bot) LeaveChat(recipient Recipient) error {
// Leave makes bot leave a group, supergroup or channel.
func (b *Bot) Leave(chat *Chat) error {
params := map[string]string{
"chat_id": recipient.Recipient(),
"chat_id": chat.Recipient(),
}
respJSON, err := b.sendCommand("leaveChat", params)
@ -568,7 +568,7 @@ func (b *Bot) ProfilePhotosOf(user *User) ([]Photo, error) {
// ChatMemberOf return information about a member of a chat.
//
// Returns a ChatMember object on success.
func (b *Bot) ChatMemberOf(chat *Chat, user *User) (ChatMember, error) {
func (b *Bot) ChatMemberOf(chat *Chat, user *User) (*ChatMember, error) {
params := map[string]string{
"chat_id": chat.Recipient(),
"user_id": user.Recipient(),
@ -576,22 +576,22 @@ func (b *Bot) ChatMemberOf(chat *Chat, user *User) (ChatMember, error) {
respJSON, err := b.sendCommand("getChatMember", params)
if err != nil {
return ChatMember{}, err
return nil, err
}
var resp struct {
Ok bool
Result ChatMember
Result *ChatMember
Description string `json:"description"`
}
err = json.Unmarshal(respJSON, &resp)
if err != nil {
return ChatMember{}, errors.Wrap(err, "bad response json")
return nil, errors.Wrap(err, "bad response json")
}
if !resp.Ok {
return ChatMember{}, errors.Errorf("api error: %s", resp.Description)
return nil, errors.Errorf("api error: %s", resp.Description)
}
return resp.Result, nil

@ -41,23 +41,18 @@ func (c *Chat) Recipient() string {
// ChatMember object represents information about a single chat member.
type ChatMember struct {
User *User `json:"user"`
Status MemberStatus `json:"status"`
// Due for banned/restricted, Unixtime.
Until int64 `json:"until_date,omitempty"`
CanBeEdited bool `json:"can_be_edited,omitempty"`
CanChangeInfo bool `json:"can_change_info,omitempty"`
CanPostMessages bool `json:"can_post_messages,omitempty"`
CanEditMessages bool `json:"can_edit_messages,omitempty"`
CanDeleteMessages bool `json:"can_delete_messages,omitempty"`
CanInviteUsers bool `json:"can_invite_users,omitempty"`
CanRestrictMembers bool `json:"can_restrict_members,omitempty"`
CanPinMessages bool `json:"can_pin_messages,omitempty"`
CanPromoteMembers bool `json:"can_promote_members,omitempty"`
CanSendMessages bool `json:"can_send_messages,omitempty"`
CanSendMedia bool `json:"can_send_media_messages,omitempty"`
CanSendOther bool `json:"can_send_other_messages,omitempty"`
CanAddPreviews bool `json:"can_add_web_page_previews,omitempty"`
Rights
User *User `json:"user"`
Role MemberStatus `json:"status"`
// Date when restrictions will be lifted for the user, unix time.
//
// If user is restricted for more than 366 days or less than
// 30 seconds from the current time, they are considered to be
// restricted forever.
//
// Use tb.Forever().
//
RestrictedUntil int64 `json:"until_date,omitempty"`
}

@ -148,3 +148,8 @@ func embedSendOptions(params map[string]string, opt *SendOptions) {
params["reply_markup"] = string(replyMarkup)
}
}
func embedRights(p map[string]string, prv Rights) {
jsonRepr, _ := json.Marshal(prv)
json.Unmarshal(jsonRepr, p)
}

Loading…
Cancel
Save