コード例 #1
0
ファイル: rooms.c プロジェクト: blindsight/Amnuts
/*
 * See if a user has access to a room. If room is fixed to private then
 * it is considered a wizroom so grant permission to any user of WIZ and
 * above for those.
 */
int
has_room_access(UR_OBJECT user, RM_OBJECT rm)
{
  size_t i;

  /* level room checks */
  for (i = 0; priv_room[i].name; ++i) {
    if (!strcmp(rm->name, priv_room[i].name)) {
      break;
    }
  }
  if (user->invite_room == rm) {
    return 1;
  }
  if (priv_room[i].name && user->level < priv_room[i].level) {
    return 0;
  }
  if (!is_private_room(rm)) {
    return 1;
  }
  if (is_personal_room(rm)) {
    return is_my_room(user, rm) || has_room_key(user->name, rm)
      || user->level == GOD;
  }
  if (is_fixed_room(rm)) {
    return user->level >= WIZ;
  }
  return user->level >= amsys->gatecrash_level;
}
コード例 #2
0
ファイル: boards.c プロジェクト: Lopo/Lotos
/*** Wipe some messages off the board ***/
void wipe_board(UR_OBJECT user)
{
    int cnt;
    char fname[FNAME_LEN],*name,rmname[ROOM_NAME_LEN+1];
    RM_OBJECT rm=user->room;

    set_crash();
    if (word_count<2 && ((user->level>=WIZ && !is_personal_room(rm))
                         || (is_personal_room(rm) && (is_my_room(user,rm) || user->level>=GOD)))) {
        write_usage(user,"wipe all");
        write_usage(user,"wipe <#>");
        write_usage(user,"wipe to <#>");
        write_usage(user,"wipe from <#> to <#>");
        return;
    }
    else if (word_count<2
             && ((user->level<WIZ && !is_personal_room(rm))
                 || (is_personal_room(rm)
                     && !is_my_room(user,rm)
                     && user->level<GOD
                    )
                )
            ) {
        write_usage(user,"wipe <#>");
        return;
    }
    switch (is_personal_room(rm)) {
    case 0:
        if (user->level<WIZ && !(check_board_wipe(user))) return;
        else if (get_wipe_parameters(user)==-1) return;
        break;
    case 1:
        if (!is_my_room(user,rm) && user->level<GOD && !check_board_wipe(user)) return;
        else if (get_wipe_parameters(user)==-1) return;
        break;
    }
    if (user->vis) name=user->recap;
    else name=invisname;
    if (rm->access==PERSONAL_LOCKED || rm->access==PERSONAL_UNLOCKED) {
        midcpy(rm->name,rmname,1,strlen(rm->name)-2);
        rmname[0]=toupper(rmname[0]);
        sprintf(fname,"%s/%s.B", USERROOMS, rmname);
    }
    else sprintf(fname,"%s/%s.B", ROOMFILES, rm->name);
    if (!rm->mesg_cnt) {
        write_user(user, wipe_empty_board);
        return;
    }
    if (user->wipe_from==-1) {
        unlink(fname);
        write_user(user, wipe_user_all_deleted);
        if (user->level<GOD || user->vis) vwrite_room_except(rm, user, wipe_room_all_deleted, name);
        write_syslog(SYSLOG,1,"%s wiped all messages from the board in the %s.\n",user->name,rm->name);
        rm->mesg_cnt=0;
        return;
    }
    if (user->wipe_from>rm->mesg_cnt) {
        vwrite_user(user,"There %s only %d message%s on the board.\n",PLTEXT_IS(rm->mesg_cnt),rm->mesg_cnt,PLTEXT_S(rm->mesg_cnt));
        return;
    }
    cnt=wipe_messages(fname,user->wipe_from,user->wipe_to,0);
    if (cnt==rm->mesg_cnt) {
        unlink(fname);
        vwrite_user(user, wipe_too_many, rm->mesg_cnt, grm_num(8, rm->mesg_cnt));
        if (user->level<GOD || user->vis) vwrite_room_except(rm,user,"%s maze nastenku.\n",name);
        write_syslog(SYSLOG,1,"%s wiped all messages from the board in the %s.\n",user->name,rm->name);
        rm->mesg_cnt=0;
        return;
    }
    rm->mesg_cnt-=cnt;
    vwrite_user(user, wipe_user_delete_range, cnt, grm_num(8, cnt), grm_num(9, cnt));
    if (user->level<GOD || user->vis) vwrite_room_except(rm,user,"%s wipes some messages from the board.\n",name);
    write_syslog(SYSLOG,1,"%s wiped %d message%s from the board in the %s.\n",user->name,cnt,PLTEXT_S(cnt),rm->name);
}