回精華區
作者bluesway.bbs@bluesway.tfcis.org (雲淡風輕) 看板: plan
標題cygwin 相簿功能
時間蓽路小築 (2005/07/20 Wed 21:13:20) Updated: 2005/07/20
因為精華區裡的 BBS 帳號與相簿同步 一直弄不起來

加上想多些功能

就自己寫了一支程式

使用者自己決定要不要開相簿

還可以花錢買相簿的空間 (不然有錢都沒地方花)

要先利用 AppServ 架站,再架設 Coppermine Photo Gallery

以下程式設計在 cygwin 中運作

其它作業系統可能有些地方要自己修正一下

另外,我的功力很淺,可能程式運作效率不是很好

歡迎高手指正修改 :)


: maple/menu.c 適當選項中加入

+ main_album, PERM_BASIC, M_GAME,
+ "Gallery    ♂ 設定相簿 ♀",


: maple/Makefile

SRC =
        ../so/jcee.c ../so/dict.c ../so/lottery.c ../so/album.c \

OBJ =
        ../so/jcee.o ../so/dict.o ../so/lottery.o ../so/album.o \


: maple/bbsd.c:belong_list() 拿掉 static

- static int         /* 1:在list中 0:不在list中 */
+ int         /* 1:在list中 0:不在list中 */
belong_list(filelist, key, desc)


: maple/maple.p

/* bbsd.c */
+ int belong_list(char *filelist, char *key, char *desc);

...

/* so */
+ int main_album();


: include/global.h

#define FN_ETC_LOVELETTER "etc/loveletter"  /* 情書產生器文庫 */
#define FN_ETC_CLASS    "etc/class"           /* 看板分類顏色 */
+ #define FN_ETC_ALBUM        "etc/album"     /* 相簿 */

...

/* ----------------------------------------------------- */
/* 訊息字串:獨立出來,以利支援各種語言          */
/* ----------------------------------------------------- */

+ #define MYSQL_PATH  "/cygdrive/c/AppServ/mysql/bin/mysql"
+                                  /* MySQL 執行檔的路徑 */
+ #define ROOTPASS    "bedbtkbryowtdemrcouwxkatieixhxgns"
+                                  /* MySQL 管理者密碼 */


: maple/acct.c:acct_setup() 改密碼時順便改相簿密碼

acct_setup(u, adm)
  ACCT *u;
  int adm;
{
  ACCT x;
  int i, num;
  char *str, buf[80], pass[PSWDLEN + 1];
+ char cmd[256], quota[27]

...

      vget(i + 1, 0, "檢查新密碼:", buf, PSWDLEN + 1, NOECHO);
      if (!strcmp(buf, pass))
      {
        str_ncpy(x.passwd, genpasswd(buf), sizeof(x.passwd));

+       if (belong_list(FN_ETC_ALBUM, x.userid, quota))
+       {
+         sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;"
+           "Update cpg132_users Set user_password=\'%s\' "
+           "Where user_name=\'%s\';\"", buf, x.userid);
+         system(cmd);
+       }

        break;
      }

: so/album.c 新增此程式

/*-------------------------------------------------------*/
/* so/album.c           ( NTHU CS MapleBBS Ver 3.10 )    */
/*-------------------------------------------------------*/
/* target : 相簿功能                                     */
/* create : 05/06/06                                     */
/* author : bluesway@tfcis.org                           */
/*-------------------------------------------------------*/

#include "bbs.h"

#if 0

    本程式假設 AppServ 是按照預設路徑安裝 (不是的話要改 MYSQL_PATH)
    cpg 資料庫的相關設定也都按照預設值來安裝

    在 cpg 資料庫中,每個使用者各自成一個 group (才能改 quota)
    並以 userno 當作 group id

    使用者可以用的空間限制記錄在 FN_ETC_ALBUM

#endif

#define P_ALBUM     50000   /* 每本相簿的價格 */
#define P_BQUOTA    10      /* 每買 1KB 相簿空間的價格 */
#define P_SQUOTA    8       /* 每賣 1KB 相簿空間的價格 */
#define QUOTA       10240   /* 預設的相簿空間 (KB) */

static int
album_create()
{
  char passwd[PSWDLEN + 1], regtime[50], cmd[200];
  struct tm *local;
  time_t now;
  FILE *fp;

  /* regtime 借來填一下參數 */
  if (!belong_list(FN_ETC_ALBUM, cuser.userid, regtime))
  {
    sprintf(cmd, "買相簿需要花 %d 銀幣喔!", P_ALBUM);
    vmsg(cmd);

    if (cuser.money < 50000 || vans("確定要買嗎?[Y/n]") == 'n')
      return XO_FOOT;
  }
  else
  {
    vmsg("您已經有相簿了!");
    return XO_FOOT;
  }

  vget(b_lines, 0, "◆ 請輸入密碼確認:", passwd, PSWDLEN + 1, NOECHO);

  if (chkpasswd(cuser.passwd, passwd))
  {
    vmsg("Sorry..密碼有誤!");
    return XO_FOOT;
  }

  local = localtime(&now);
  time(&now);
  sprintf(regtime, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", local->tm_year + 1900,
        local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min,
        local->tm_sec);

  if (!HAS_PERM(PERM_SYSOP))  /* 站長一定是 CPG 管理員群組,不必另建群組 */
  {
    sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;Insert "
      "cpg132_usergroups(group_id,group_name) Values(%d,\'%s\');\"",
      cuser.userno, cuser.userid);
    system(cmd);
  }

  sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;Insert "
    "cpg132_users(user_group,user_name,user_password,user_regdate) "
    "Values(%d,\'%s\',\'%s\',\'%s\');\"",
    (HAS_PERM(PERM_SYSOP) ? 1 : cuser.userno), cuser.userid,
    passwd, regtime);
  system(cmd);

  fp = fopen(FN_ETC_ALBUM, "a");
  /* 站長不需要限制 quota */
  fprintf(fp, "%s %d\n", cuser.userid, (HAS_PERM(PERM_SYSOP) ? 0 : QUOTA));
  fclose(fp);

  /* 站長買相簿不用錢 */
  cuser.money -= HAS_PERM(PERM_SYSOP) ? 0 : P_ALBUM;

  /* 借 regtime 和 cmd 來 秀訊息 */
  sprintf(regtime, "%.3f MB", QUOTA / 1024.0);
  sprintf(cmd, "相簿建立完成!祝使用愉快..您目前有可用空間 %s。",
        (HAS_PERM(PERM_SYSOP) ? "無限大" : regtime));
  vmsg(cmd);
}


static int
album_buyquota()
{
  int num, update;
  char buf[50], quota[27], cmd[200], fpath[64];
  FILE *fpr, *fpw;

  if (!belong_list(FN_ETC_ALBUM, cuser.userid, quota))
  {
    vmsg("您尚未購買相簿喔!");
    return XO_FOOT;
  }

  sprintf(cmd, "相簿空間 %d銀 / KBytes,您要買多少 KB 呢?", P_BQUOTA);

  if (!vget(b_lines, 0, cmd, buf, 11, DOECHO))
    return XO_FOOT;

  num = atoi(buf);

  if (cuser.money < num * P_BQUOTA)
  {
    vmsg("您的現金不足!");
    return XO_FOOT;
  }

  update = atoi(quota) + num;

  if (update < 0)
  {
    vmsg("您沒有足夠空間可以釋出");
    return XO_FOOT;
  }

  sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;"
    "Update cpg132_usergroups Set group_quota=%d "
    "Where group_name=\'%s\';\"", update, cuser.userid);
  system(cmd);

  fpr = fopen(FN_ETC_ALBUM, "r");
  sprintf(fpath, "%s.tmp", FN_ETC_ALBUM);
  fpw = fopen(fpath, "w");

  /* 借用 cmd, buf 來更新資料 */
  while (fgets(cmd, sizeof(cmd), fpr))
  {
    if (strstr(cmd, cuser.userid))
    {
      sprintf(buf, "%s %d\n", cuser.userid, update);
      strcpy(cmd, buf);
    }
    fputs(cmd, fpw);
  }
  fclose(fpw);
  fclose(fpr);
  unlink(FN_ETC_ALBUM);
  rename(fpath, FN_ETC_ALBUM);

  cuser.money -= num < 0 ? num * P_SQUOTA : num * P_BQUOTA;

  if (num >= 0)
    sprintf(cmd, "購買 %d KB,花費 %d 銀幣!您目前可使用的空間是 %.3f MB。",
        num, num * P_BQUOTA, update / 1024.0);
  else
    sprintf(cmd, "釋出 %d KB,換回 %d 銀幣!您目前可使用的空間是 %.3f MB。",
        num * -1, num * P_SQUOTA * -1, update / 1024.0);
  vmsg(cmd);
}


int
main_album()
{
  int ans;

  switch (ans = vans("◎ 相簿 1)建立相簿 2)購買容量?[Q] "))
  {
    case '1':
      album_create();
      break;

    case '2':
      if (!HAS_PERM(PERM_SYSOP)) /* 站長不需要 */
        album_buyquota();
      break;

    default:
      return XEASY;
  }
}

--


        你已經明瞭了嗎?那就去做吧!

--
 戚戚於簡短的 bluesway.tfcis.org 我無法言語孤獨強襲上 蓽路小築
 幻化為囹圄中一抹 bluesway 的淡影我找不到出口回到 218-171-208-186.dynamic.
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻