ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Changeset 11017


Ignore:
Timestamp:
Mar 13, 2009, 2:11:02 PM (10 years ago)
Author:
toraneko
Message:

連続投稿抑止機能 #3731

Location:
OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/config.php.sample

    r9372 r11017  
    599599$GLOBALS['_ALLOWED_IP_LIST_FOR_KANSHI'] = array();
    600600
     601// 連続投稿確認用
     602//
     603// 連続投稿のチェック対象とするアクション
     604$GLOBALS['CHECK_POST_ACTIONS'] = array(
     605'pc' => array(
     606    'do_h_diary_add_insert_c_diary',
     607    'do_fh_diary_insert_c_diary_comment',
     608    'do_h_com_add_insert_c_commu',
     609    'do_c_topic_add_insert_c_commu_topic',
     610    'do_c_topic_write_insert_c_commu_topic_comment',
     611    'do_c_event_add_insert_c_commu_topic',
     612    'do_c_event_write_insert_c_commu_topic_comment',
     613    'do_f_message_send_insert_c_message',
     614    'do_f_link_request_insert_c_friend_confirm',
     615));
     616
     617// 連続投稿と判断する間隔(秒)
     618// 0を指定した場合、チェックしない
     619define('POST_INTERVAL_UNFAIR_SECOND', 0);
     620
     621// 前回から[POST_INTERVAL_UNFAIR_SECOND]秒以内の投稿が、
     622// 何回行われた時に、連続投稿と判断するか
     623define('POST_INTERVAL_UNFAIR_COUNT', 10);
     624
     625// 前回投稿から何秒以上あいていたら、連続投稿回数をリセットするか
     626// 0を指定した場合、リセットしない
     627define('POST_INTERVAL_UNFAIR_COUNT_RESET_SECOND', 60*60);
     628
     629// 前回投稿時刻と投稿回数の保存先
     630// 0:セッション
     631// 1:データベース
     632define('POST_INFO_STORAGE', 0);
     633
     634//
     635
     636//
    601637?>
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/setup/sql/mysql40/install/install-2.13.6-create_tables.sql

    r10883 r11017  
    904904) TYPE=MyISAM;
    905905
     906CREATE TABLE `c_post_info` (
     907  `c_post_info_id` int(11) NOT NULL auto_increment,
     908  `c_member_id` int(11) NOT NULL default '0',
     909  `last_post_time` int(11) NOT NULL default '0',
     910  `last_post_count` int(11) NOT NULL default '0',
     911  `r_datetime` datetime NOT NULL default '0000-00-00 00:00:00',
     912  PRIMARY KEY  (`c_post_info_id`),
     913  KEY `c_member_id` (`c_member_id`)
     914) TYPE=MyISAM;
     915
    906916CREATE TABLE `c_profile` (
    907917  `c_profile_id` int(11) NOT NULL auto_increment,
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/setup/sql/mysql41/install/install-2.13.6-create_tables.sql

    r10881 r11017  
    906906) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    907907
     908CREATE TABLE `c_post_info` (
     909  `c_post_info_id` int(11) NOT NULL auto_increment,
     910  `c_member_id` int(11) NOT NULL default '0',
     911  `last_post_time` int(11) NOT NULL default '0',
     912  `last_post_count` int(11) NOT NULL default '0',
     913  `r_datetime` datetime NOT NULL default '0000-00-00 00:00:00',
     914  PRIMARY KEY  (`c_post_info_id`),
     915  KEY  `c_member_id` (`c_member_id`)
     916) ENGINE=MyISAM DEFAULT CHARSET=utf8;
     917
    908918CREATE TABLE `c_profile` (
    909919  `c_profile_id` int(11) NOT NULL auto_increment,
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/setup/sql/postgres74/install/install-2.13.6-create_tables.sql

    r10885 r11017  
    938938CREATE INDEX c_point_log_tag_c_point_log_id_2 on c_point_log_tag (c_point_log_id,tag);
    939939
     940CREATE TABLE c_post_info (
     941  c_post_info_id serial NOT NULL,
     942  c_member_id int4 NOT NULL default '0',
     943  last_post_time int4 NOT NULL default '0',
     944  last_post_info int4 NOT NULL default '0',
     945  r_datetime timestamp NOT NULL default '0000-01-01 00:00:00',
     946  PRIMARY KEY  (c_post_info_id)
     947);
     948CREATE INDEX c_post_info_c_member_id on c_post_info (c_member_id);
     949
    940950CREATE TABLE c_profile (
    941951  c_profile_id serial NOT NULL,
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/webapp/lib/db/etc.php

    r9020 r11017  
    949949}
    950950
     951/**
     952 * DBから前回POST情報を取得する
     953 *
     954 * @params : $u
     955 *
     956 * @return array();
     957 **/
     958function db_etc_get_post_info($u)
     959{
     960    $sql = 'SELECT * FROM c_post_info WHERE c_member_id = ?';
     961    $params = array($u);
     962    $result = db_get_row($sql, $params);
     963    return array($result['last_post_time'], $result['last_post_count']);
     964}
     965
     966/**
     967 * DBにPOST情報を設定する
     968 *
     969 * @params : $u
     970 * @params : $post_time
     971 * @params : $post_count
     972 *
     973 **/
     974function db_etc_set_post_info($u, $post_time, $post_count)
     975{
     976    $data = array('last_post_time' => $post_time,
     977                  'last_post_count' => $post_count,
     978                  'r_datetime' => db_now(),
     979                 );
     980   
     981    // update
     982    $where = "c_member_id = $u";
     983    if (db_update('c_post_info', $data, $where) && db_affected_rows()) {
     984        return true;
     985    }
     986
     987    // insert
     988    $data['c_member_id'] = $u;
     989    return (bool)db_insert('c_post_info', $data);
     990}
     991
    951992?>
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/webapp/lib/util/util.php

    r10821 r11017  
    10621062}
    10631063
     1064/**
     1065 * 連続投稿チェック用の情報を取得する
     1066 *
     1067 * @return array
     1068 */
     1069function util_get_post_info($u)
     1070{
     1071    $last_post_time = '';
     1072    $post_count = 0;
     1073
     1074    switch (POST_INFO_STORAGE) {
     1075        case 0 :
     1076            $last_post_time = $_SESSION['last_post_time'];
     1077            $post_count = $_SESSION['post_count'];
     1078            break;
     1079        case 1 :
     1080            list($last_post_time, $post_count) = db_etc_get_post_info($u);
     1081            break;
     1082    }
     1083
     1084    return array($last_post_time, $post_count);
     1085}
     1086
     1087/**
     1088 * 連続投稿チェック用の情報を設定する
     1089 *
     1090 * @return array
     1091 */
     1092function util_set_post_info($u, $post_time, $post_count)
     1093{
     1094    switch (POST_INFO_STORAGE) {
     1095        case 0 :
     1096            $_SESSION['last_post_time'] = $post_time;
     1097            $_SESSION['post_count'] = $post_count;
     1098            break;
     1099        case 1 :
     1100            db_etc_set_post_info($u, $post_time, $post_count);
     1101            break;
     1102    }
     1103
     1104    return true;
     1105}
     1106
     1107/**
     1108 * 連続投稿確認用
     1109 *
     1110 * @params  $action : Check Action
     1111 * @params  $u : operation c_member_id
     1112 * @return  true  : post OK
     1113 *          false : post NG
     1114 **/
     1115function util_do_post_interval_ok($action, $u = 0)
     1116{
     1117    $result = true;
     1118
     1119    if (!POST_INTERVAL_UNFAIR_SECOND) {
     1120        // チェックしない
     1121    } else if (in_array($action, $GLOBALS['CHECK_POST_ACTIONS']['pc'])) {
     1122        //保持している情報
     1123        list($last_post_time, $post_count) = util_get_post_info($u);
     1124
     1125        //連続投稿チェック
     1126        $now_time = time();
     1127        if ($last_post_time) {
     1128            if (($now_time - $last_post_time) < POST_INTERVAL_UNFAIR_SECOND) {
     1129                // 設定時間内の場合カウントアップ
     1130                $post_count ++;
     1131            } else if (!POST_INTERVAL_UNFAIR_COUNT_RESET_SECOND) {
     1132                // リセットしない
     1133            } else if (($now_time - $last_post_time) > POST_INTERVAL_UNFAIR_COUNT_RESET_SECOND) {
     1134                //前回投稿から指定時間以上あいていれば、カウントをリセットする
     1135                $post_count = 1;
     1136            }
     1137
     1138            if ($post_count > POST_INTERVAL_UNFAIR_COUNT) {
     1139                //連続投稿とみなす
     1140                $result = false;
     1141            }
     1142        } else {
     1143            $post_count = 1;
     1144        }
     1145        //情報更新
     1146        util_set_post_info($u, $now_time, $post_count);
     1147    }
     1148
     1149    return $result;
     1150}
     1151
    10641152?>
  • OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731/webapp/modules/pc/init.inc

    r8857 r11017  
    1515}
    1616//>
    17 
    1817function init_pc_page(&$smarty)
    1918{
     
    8584        }
    8685    }
     86
     87    // 連続投稿確認
     88    if ($is_secure) {
     89        $u = $GLOBALS['AUTH']->uid();
     90        $action = 'do_' . $GLOBALS['__Framework']['current_action'];
     91
     92        if (!util_do_post_interval_ok($action, $u)) {
     93            openpne_display_error();
     94        }
     95    }
     96
    8797}
    8898
Note: See TracChangeset for help on using the changeset viewer.