本文整理汇总了Golang中github.com/tinode/chat/server/store/types.AccessMode类的典型用法代码示例。如果您正苦于以下问题:Golang AccessMode类的具体用法?Golang AccessMode怎么用?Golang AccessMode使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了AccessMode类的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: makeInvite
func (t *Topic) makeInvite(notify, target, from types.Uid, act types.InviteAction, modeWant,
modeGiven types.AccessMode, info interface{}) *ServerComMessage {
// FIXME(gene): this is a workaround for gorethink's broken way of marshalling json
inv, err := json.Marshal(MsgInvitation{
Topic: t.name,
User: target.UserId(),
Action: act.String(),
Acs: MsgAccessMode{modeWant.String(), modeGiven.String()},
Info: info})
if err != nil {
log.Println(err)
}
converted := map[string]interface{}{}
err = json.Unmarshal(inv, &converted)
if err != nil {
log.Println(err)
}
// endof workaround
msg := &ServerComMessage{Data: &MsgServerData{
Topic: "me",
From: from.UserId(),
Timestamp: time.Now().UTC().Round(time.Millisecond),
Content: converted}, rcptto: notify.UserId()}
log.Printf("Invite generated: %#+v", msg.Data)
return msg
}
开发者ID:ycaihua,项目名称:chat,代码行数:28,代码来源:topic.go
示例2: approveSub
// approveSub processes a request to initiate an invite or approve a subscription request from another user:
// Handle these cases:
// A. Manager is inviting another user for the first time (no prior subscription)
// B. Manager is re-inviting another user (adjusting modeGiven, modeWant is still "N")
// C. Manager is changing modeGiven for another user, modeWant != "N"
func (t *Topic) approveSub(h *Hub, sess *Session, target types.Uid, set *MsgClientSet) error {
now := time.Now().UTC().Round(time.Millisecond)
// Check if requester actually has permission to manage sharing
if userData, ok := t.perUser[sess.uid]; !ok || !userData.modeGiven.IsManager() || !userData.modeWant.IsManager() {
sess.queueOut(ErrPermissionDenied(set.Id, t.original, now))
return errors.New("topic access denied")
}
// Parse the access mode granted
var modeGiven types.AccessMode
if set.Sub.Mode != "" {
modeGiven.UnmarshalText([]byte(set.Sub.Mode))
}
// If the user is banned from topic, make sute it's the only change
if modeGiven.IsBanned() {
modeGiven = types.ModeBanned
}
// Make sure no one but the owner can do an ownership transfer
if modeGiven.IsOwner() && t.owner != sess.uid {
sess.queueOut(ErrPermissionDenied(set.Id, t.original, now))
return errors.New("attempt to transfer ownership by non-owner")
}
var givenBefore types.AccessMode
// Check if it's a new invite. If so, save it to database as a subscription.
// Saved subscription does not mean the user is allowed to post/read
userData, ok := t.perUser[target]
if !ok {
if modeGiven == types.ModeNone {
if t.accessAuth != types.ModeNone {
// Request to use default access mode for the new subscriptions.
modeGiven = t.accessAuth
} else {
sess.queueOut(ErrMalformed(set.Id, t.original, now))
return errors.New("cannot invite without giving any access rights")
}
}
// Add subscription to database
sub := &types.Subscription{
User: target.String(),
Topic: t.name,
ModeWant: types.ModeNone,
ModeGiven: modeGiven,
}
if err := store.Subs.Create(sub); err != nil {
sess.queueOut(ErrUnknown(set.Id, t.original, now))
return err
}
userData = perUserData{
modeGiven: sub.ModeGiven,
modeWant: sub.ModeWant,
private: nil,
}
t.perUser[target] = userData
} else {
// Action on an existing subscription (re-invite or confirm/decline)
givenBefore = userData.modeGiven
// Request to re-send invite without changing the access mode
if modeGiven == types.ModeNone {
modeGiven = userData.modeGiven
} else if modeGiven != userData.modeGiven {
userData.modeGiven = modeGiven
// Save changed value to database
if err := store.Subs.Update(t.name, sess.uid,
map[string]interface{}{"ModeGiven": modeGiven}); err != nil {
return err
}
t.perUser[target] = userData
}
}
// The user does not want to be bothered, no further action is needed
if userData.modeWant.IsBanned() {
sess.queueOut(ErrPermissionDenied(set.Id, t.original, now))
return errors.New("topic access denied")
}
// Handle the following cases:
// * a ban of the user, modeGive.IsBanned = true (if user is banned no need to invite anyone)
// * regular invite: modeWant = "N", modeGiven > 0
// * access rights update: old modeGiven != new modeGiven
if !modeGiven.IsBanned() {
if userData.modeWant == types.ModeNone {
// (re-)Send the invite to target
//.........这里部分代码省略.........
开发者ID:ycaihua,项目名称:chat,代码行数:101,代码来源:topic.go
示例3: requestSub
// User requests or updates a self-subscription to a topic
// h - hub
// sess - originating session
// pktId - originating packet Id
// want - requested access mode
// info - explanation info given by the requester
// private - private value to assign to the subscription
// Handle these cases:
// A. User is trying to subscribe for the first time (no subscription)
// B. User is already subscribed, just joining without changing anything
// C. User is responsing to an earlier invite (modeWant was "N" in subscription)
// D. User is already subscribed, changing modeWant
// E. User is accepting ownership transfer (requesting ownership transfer is not permitted)
func (t *Topic) requestSub(h *Hub, sess *Session, pktId string, want string, info,
private interface{}, loaded bool) error {
log.Println("requestSub", t.name)
now := time.Now().UTC().Round(time.Millisecond)
// Parse the acess mode requested by the user
var modeWant types.AccessMode
var explicitWant bool
if want != "" {
log.Println("mode want explicit: ", want)
modeWant.UnmarshalText([]byte(want))
explicitWant = true
}
// If the user wants a self-ban, make sure it's the only change
if modeWant.IsBanned() {
modeWant = types.ModeBanned
}
// Vars for saving changes to access mode
var updWant *types.AccessMode
var updGiven *types.AccessMode
// Check if it's an attempt at a new subscription to the topic. If so, save it to database
userData, existingSub := t.perUser[sess.uid]
if !existingSub {
// User requested default access mode.
// modeWant could still be ModeNone if the owner wants to manually approve every request
if modeWant == types.ModeNone {
if explicitWant {
// The operation is invalid - user requested to clear access to topic which makes no sense.
sess.queueOut(ErrMalformed(pktId, t.original, now))
return errors.New("attempt to clear topic access")
}
modeWant = t.accessAuth
}
userData = perUserData{
private: private,
modeGiven: t.accessAuth,
modeWant: modeWant,
}
// If it's a re-subscription to a p2p topic, set public
if t.cat == types.TopicCat_P2P {
// t.perUser contains just one element - other user
for uid2, _ := range t.perUser {
if user2, err := store.Users.Get(uid2); err != nil {
log.Println(err.Error())
sess.queueOut(ErrUnknown(pktId, t.original, now))
return err
} else {
userData.public = user2.Public
}
break
}
}
// Add subscription to database
sub := &types.Subscription{
User: sess.uid.String(),
Topic: t.name,
ModeWant: userData.modeWant,
ModeGiven: userData.modeGiven,
Private: userData.private,
}
if err := store.Subs.Create(sub); err != nil {
log.Println(err.Error())
sess.queueOut(ErrUnknown(pktId, t.original, now))
return err
}
} else {
var ownerChange bool
// Process update to existing subscription. It could be an incomplete subscription for a new topic.
// If user did not request a new access mode, copy one from cache
if !explicitWant && modeWant == types.ModeNone {
modeWant = userData.modeWant
}
if userData.modeGiven.IsOwner() {
// Check for possible ownership transfer. Handle the following cases:
//.........这里部分代码省略.........
开发者ID:ycaihua,项目名称:chat,代码行数:101,代码来源:topic.go
示例4: gen_rethink
//.........这里部分代码省略.........
for _, ss := range data.Subscriptions {
u1 := ss["user"].(string)
u2 := ss["topic"].(string)
if u2[0] == '*' {
// skip group topics
continue
}
var pair string
var idx int
if u1 < u2 {
pair = u1 + ":" + u2
idx = 0
} else {
pair = u2 + ":" + u1
idx = 1
}
if _, ok := p2pIndex[pair]; !ok {
p2pIndex[pair] = make([]map[string]interface{}, 2)
}
p2pIndex[pair][idx] = ss
}
log.Printf("Collected p2p pairs: %d\n", len(p2pIndex))
for pair, subs := range p2pIndex {
uid1 := types.ParseUid(nameIndex[subs[0]["user"].(string)])
uid2 := types.ParseUid(nameIndex[subs[1]["user"].(string)])
topic := uid1.P2PName(uid2)
created0 := getCreatedTime(subs[0]["createdAt"])
created1 := getCreatedTime(subs[1]["createdAt"])
var s0want, s0given, s1want, s1given types.AccessMode
if err := s0want.UnmarshalText([]byte(subs[0]["modeWant"].(string))); err != nil {
log.Fatal(err)
}
if err := s0given.UnmarshalText([]byte(subs[0]["modeHave"].(string))); err != nil {
log.Fatal(err)
}
if err := s1want.UnmarshalText([]byte(subs[1]["modeWant"].(string))); err != nil {
log.Fatal(err)
}
if err := s1given.UnmarshalText([]byte(subs[1]["modeHave"].(string))); err != nil {
log.Fatal(err)
}
log.Printf("Processing %s (%s), %s, %s", pair, topic, uid1.String(), uid2.String())
err := store.Topics.CreateP2P(
&types.Subscription{
ObjHeader: types.ObjHeader{CreatedAt: created0},
User: uid1.String(),
Topic: topic,
ModeWant: s0want,
ModeGiven: s0given,
Private: subs[0]["private"]},
&types.Subscription{
ObjHeader: types.ObjHeader{CreatedAt: created1},
User: uid2.String(),
Topic: topic,
ModeWant: s1want,
ModeGiven: s1given,
Private: subs[1]["private"]})
if err != nil {
开发者ID:steelannelida,项目名称:tinode-chat,代码行数:67,代码来源:rethink.go
注:本文中的github.com/tinode/chat/server/store/types.AccessMode类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论