insert( $table_name, array( 'group_name' => $group_name, 'group_description' => $group_description, 'group_status' => $group_status, 'founder_id' => absint( $founder_id ), 'founded' => current_time( 'mysql' ), 'member_count' => 0 ), array( '%s', '%s', '%s', '%d', '%s', '%d' ) ); $group_id = $wpdb->insert_id; if ( $affected ) aag_join_group( $group_id, absint( $grouparr['founder_id'] ) ); return $group_id; } function aag_update_group( $group_id, $grouparr = array() ) { global $wpdb; $group_name = $grouparr['group_name']; $group_name = strip_tags( $group_name ); $group_name = normalize_whitespace( $group_name ); $group_name = trim( $group_name ); if ( empty( $group_name ) ) $group_name = __( 'Untitled', 'aag' ); $group_description = $grouparr['group_description']; $group_description = strip_tags( $group_description ); $group_description = normalize_whitespace( $group_description ); $group_description = trim( $group_description ); $group_status = preg_replace( '/[^a-z_]/', '', $grouparr['group_status'] ); if ( ! in_array( $group_status, array( 'open', 'closed' ) ) ) $group_status = 'open'; $grouparr = array( 'group_name' => $group_name, 'group_description' => $group_description, 'group_status' => $group_status ); $table_name = aag_db_table( "groups" ); $wpdb->update( $table_name, $grouparr, array( 'group_id' => absint( $group_id ) ), '%s', '%d' ); } function aag_get_groups( $args = '' ) { global $wpdb; $defaults = array( 'perpage' => 0, 'offset' => 0, 'search' => '' ); $args = wp_parse_args( $args, $defaults ); extract( $args, EXTR_SKIP ); $table_name = aag_db_table( "groups" ); $query = "SELECT * FROM $table_name WHERE 1 = 1"; if ( $search = trim( $search ) ) { $search = explode( ' ', $search ); foreach( $search as $s ) { $query .= " AND (1 = 0"; $query .= $wpdb->prepare( " OR group_name LIKE %s", '%' . $s . '%' ); $query .= $wpdb->prepare( " OR group_description LIKE %s", '%' . $s . '%' ); $query .= ")"; } } $query .= " ORDER BY member_count DESC, message_count DESC, group_id DESC"; if ( $offset && $perpage ) { $query .= $wpdb->prepare( " LIMIT %d,%d", $offset, $perpage ); } elseif ( $perpage ) { $query .= $wpdb->prepare( " LIMIT %d", $perpage ); } return $wpdb->get_results( $query ); } function aag_get_your_groups( $status = array() ) { global $wpdb, $user_ID; $user_id = (int) $user_ID; $possible_status = array( 'founder', 'admin', 'member' ); if ( empty( $status ) ) { $status = $possible_status; } else { $status = array_intersect( (array) $status, $possible_status ); } $groups = aag_db_table( "groups" ); $members = aag_db_table( "group_members" ); $query = "SELECT groups.* FROM $groups as groups INNER JOIN $members USING (group_id)"; $query .= $wpdb->prepare( " WHERE user_id = %d", $user_id ); if ( ! empty( $status ) ) { $query .= " AND (1 = 0"; foreach ( $status as $s ) { $query .= $wpdb->prepare( " OR member_status LIKE %s", $s ); } $query .= ")"; } return $wpdb->get_results( $query ); } function aag_get_group( $group_id ) { global $wpdb; $group_id = absint( $group_id ); $table_name = aag_db_table( "groups" ); $query = $wpdb->prepare( "SELECT * FROM $table_name WHERE group_id = %d", $group_id ); return $wpdb->get_row( $query ); } function aag_delete_group( $group_id ) { global $wpdb; $group_id = absint( $group_id ); $groups = aag_db_table( "groups" ); $members = aag_db_table( "group_members" ); $messages = aag_db_table( "group_messages" ); $wpdb->query( $wpdb->prepare( "DELETE FROM $groups WHERE group_id = %d LIMIT 1", $group_id ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM $members WHERE group_id = %d", $group_id ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM $messages WHERE group_id = %d", $group_id ) ); } function aag_update_group_member_count( $group_id ) { global $wpdb; if ( ! $group_id = absint( $group_id ) ) return false; $count = aag_count_group_members( $group_id ); $table_name = aag_db_table( "groups" ); $wpdb->update( $table_name, array( 'member_count' => $count ), array( 'group_id' => $group_id ), array( '%d' ), array( '%d' ) ); } function aag_count_group_members( $group_id, $args = '' ) { global $wpdb; if ( ! $group_id = absint( $group_id ) ) return false; $defaults = array( 'status' => array( 'founder', 'admin', 'member' ) ); $args = wp_parse_args( $args, $defaults ); extract( $args, EXTR_SKIP ); $status = array_intersect( (array) $status, array( 'founder', 'admin', 'member', 'pending' ) ); $members = aag_db_table( "group_members" ); $query = "SELECT count(membership_id) as count FROM $members"; $query .= $wpdb->prepare( " WHERE group_id = %d", $group_id ); if ( ! empty( $status ) ) { $query .= " AND (1 = 0"; foreach ( $status as $s ) { $query .= $wpdb->prepare( " OR member_status LIKE %s", $s ); } $query .= ")"; } return (int) $wpdb->get_var( $query ); } /* Group Membership */ function aag_get_group_members( $group_id, $args = '' ) { global $wpdb; $defaults = array( 'status' => array( 'founder', 'admin', 'member' ), 'perpage' => 0, 'offset' => 0, 'search' => '' ); $args = wp_parse_args( $args, $defaults ); extract( $args, EXTR_SKIP ); $status = array_intersect( (array) $status, array( 'founder', 'admin', 'member', 'pending' ) ); $members = aag_db_table( "group_members" ); $query = "SELECT members.* FROM $members as members" . " INNER JOIN $wpdb->users as users ON members.user_id = users.ID"; $query .= $wpdb->prepare( " WHERE group_id = %d", $group_id ); if ( ! empty( $status ) ) { $query .= " AND (1 = 0"; foreach ( $status as $s ) { $query .= $wpdb->prepare( " OR member_status LIKE %s", $s ); } $query .= ")"; } if ( $search = trim( $search ) ) { $search = explode( ' ', $search ); foreach( $search as $s ) { $query .= " AND (1 = 0"; $query .= $wpdb->prepare( " OR user_login LIKE %s", '%' . $s . '%' ); $query .= $wpdb->prepare( " OR display_name LIKE %s", '%' . $s . '%' ); $query .= ")"; } } $query .= " ORDER BY member_status = 'founder' DESC, member_status = 'admin' DESC," . " member_status = 'member' DESC, membership_id ASC"; if ( $offset && $perpage ) { $query .= $wpdb->prepare( " LIMIT %d,%d", $offset, $perpage ); } elseif ( $perpage ) { $query .= $wpdb->prepare( " LIMIT %d", $perpage ); } return $wpdb->get_results( $query ); } function aag_get_group_pending_members( $group_id, $args = '' ) { $args = wp_parse_args( $args ); $args['status'] = array( 'pending' ); return aag_get_group_members( $group_id, $args ); } function aag_get_membership_by_id( $membership_id ) { global $wpdb; $table_name = aag_db_table( "group_members" ); $query = $wpdb->prepare( "SELECT * FROM $table_name WHERE membership_id = %d", $membership_id ); return $wpdb->get_row( $query ); } function aag_get_membership( $group_id, $user_id = 0 ) { global $wpdb, $user_ID; $group_id = absint( $group_id ); if ( ! $user_id = absint( $user_id ) ) $user_id = $user_ID; $table_name = aag_db_table( "group_members" ); $query = $wpdb->prepare( "SELECT * FROM $table_name WHERE group_id = %d AND user_id = %d", $group_id, $user_id ); return $wpdb->get_row( $query ); } function aag_request_to_join_group( $group_id, $user_id = 0 ) { global $wpdb, $user_ID; if ( ! $user_id = absint( $user_id ) ) $user_id = $user_ID; if ( ! $group = aag_get_group( $group_id ) ) return false; if ( 'open' == $group->group_status ) return aag_join_group( $group_id, $user_id ); if ( aag_get_membership( $group_id, $user_id ) ) // Already joined or requested return false; $table_name = aag_db_table( "group_members" ); $wpdb->insert( $table_name, array( 'group_id' => $group_id, 'user_id' => $user_id, 'member_status' => 'pending', 'joined' => current_time( 'mysql' ) ), array( '%d', '%d', '%s', '%s' ) ); } function aag_accept_member( $group_id, $user_id ) { global $wpdb; if ( ! $membership = aag_get_membership( $group_id, $user_id ) ) return false; aag_update_member_status( $group_id, $user_id, 'member' ); aag_update_group_member_count( $group_id ); } function aag_join_group( $group_id, $user_id = 0 ) { global $wpdb, $user_ID; if ( ! $user_id = absint( $user_id ) ) $user_id = $user_ID; if ( ! $group = aag_get_group( $group_id ) ) return false; if ( aag_get_membership( $group_id, $user_id ) ) // Already joined return false; if ( $group->founder_id == $user_id ) { $member_status = 'founder'; } else { $member_status = 'member'; } $table_name = aag_db_table( "group_members" ); $wpdb->insert( $table_name, array( 'group_id' => absint( $group_id ), 'user_id' => $user_id, 'member_status' => $member_status, 'joined' => current_time( 'mysql' ) ), array( '%d', '%d', '%s', '%s' ) ); aag_update_group_member_count( $group_id ); } function aag_leave_group( $group_id, $user_id = 0 ) { global $wpdb, $user_ID; if ( ! $user_id = absint( $user_id ) ) $user_id = $user_ID; if ( ! $group = aag_get_group( $group_id ) ) return false; if ( ! $membership = aag_get_membership( $group_id, $user_id ) ) // Already left return false; if ( $group->founder_id == $user_id ) return false; // Founder can not leave. $table_name = aag_db_table( "group_members" ); $query = $wpdb->prepare( "DELETE FROM $table_name WHERE membership_id = %d LIMIT 1", $membership->membership_id ); $wpdb->query( $query ); aag_update_group_member_count( $group_id ); } function aag_update_member_status( $group_id, $user_id, $status ) { global $wpdb; if ( ! $membership = aag_get_membership( $group_id, $user_id ) ) return false; $membership_id = $membership->membership_id; if ( ! in_array( $status, array( 'admin', 'member' ) ) ) return false; $members = aag_db_table( "group_members" ); $wpdb->update( $members, array( 'member_status' => $status ), array( 'membership_id' => $membership_id ), array( '%s' ), array( '%d' ) ); } /* Messages */ function aag_your_group_timeline( $group_id = 0, $author_id = 0 ) { global $wpdb, $current_user; $user_id = (int) $current_user->ID; $group_id = absint( $group_id ); $author_id = absint( $author_id ); $members = aag_db_table( "group_members" ); $messages = aag_db_table( "group_messages" ); $query = "SELECT messages.* FROM $messages as messages" . " INNER JOIN $members as members USING (group_id)" . $wpdb->prepare( " WHERE members.user_id = %d", $user_id ) . " AND member_status IN ('founder', 'admin', 'member')" . " AND message_status = 'normal'"; if ( $group_id ) $query .= $wpdb->prepare( " AND messages.group_id = %d", $group_id ); if ( $author_id ) $query .= $wpdb->prepare( " AND messages.user_id = %d", $author_id ); $query .= " ORDER BY posted DESC LIMIT 20"; return $wpdb->get_results( $query ); } function aag_post_message( $group_id, $content, $reply_to = 0, $user_id = 0 ) { global $wpdb, $user_ID; $content = strip_tags( $content ); $content = normalize_whitespace( $content ); $content = trim( $content ); if ( empty( $content ) ) return false; if ( ! $group_id = absint( $group_id ) ) return false; if ( ! $user_id = absint( $user_id ) ) $user_id = $user_ID; if ( ! $membership = aag_get_membership( $group_id, $user_id ) ) return false; $reply_to = absint( $reply_to ); if ( ! aag_get_message_by_id( $reply_to ) ) $reply_to = 0; $table_name = aag_db_table( "group_messages" ); $wpdb->insert( $table_name, array( 'group_id' => $group_id, 'user_id' => $user_id, 'message_status' => 'normal', 'message_content' => trim( $content ), 'reply_to' => $reply_to, 'posted' => current_time( 'mysql' ) ), array( '%d', '%d', '%s', '%s', '%d', '%s' ) ); aag_update_group_message_count( $group_id ); aag_update_group_member_message_count( $group_id, $user_id ); } function aag_delete_message( $message_id ) { global $wpdb; if ( ! $message = aag_get_message_by_id( $message_id ) ) return false; $group_id = $message->group_id; $user_id = $message->user_id; $messages = aag_db_table( "group_messages" ); $query = $wpdb->prepare( "DELETE FROM $messages WHERE message_id = %d LIMIT 1", $message_id ); $wpdb->query( $query ); $wpdb->update( $messages, array( 'reply_to' => 0 ), array( 'reply_to' => $message_id ), array( '%d' ), array( '%d' ) ); aag_update_group_message_count( $group_id ); aag_update_group_member_message_count( $group_id, $user_id ); } function aag_get_message_by_id( $message_id ) { global $wpdb; $messages = aag_db_table( "group_messages" ); $query = $wpdb->prepare( "SELECT * FROM $messages WHERE message_id = %d", $message_id ); return $wpdb->get_row( $query ); } function aag_update_group_message_count( $group_id ) { global $wpdb; if ( ! $group_id = absint( $group_id ) ) return false; $table_name = aag_db_table( "group_messages" ); $query = $wpdb->prepare( "SELECT count(message_id) as count FROM $table_name WHERE group_id = %d", $group_id ); $count = (int) $wpdb->get_var( $query ); $table_name = aag_db_table( "groups" ); $wpdb->update( $table_name, array( 'message_count' => $count ), array( 'group_id' => $group_id ), array( '%d' ), array( '%d' ) ); } function aag_update_group_member_message_count( $group_id, $user_id = 0 ) { global $wpdb, $user_ID; if ( ! $group_id = absint( $group_id ) ) return false; if ( ! $user_id = absint( $user_id ) ) $user_id = $user_ID; $table_name = aag_db_table( "group_messages" ); $query = $wpdb->prepare( "SELECT count(message_id) as count FROM $table_name" . " WHERE group_id = %d AND user_id = %d", $group_id, $user_id ); $count = (int) $wpdb->get_var( $query ); $table_name = aag_db_table( "group_members" ); $wpdb->update( $table_name, array( 'message_count' => $count ), array( 'group_id' => $group_id, 'user_id' => $user_id ), '%d', '%d' ); } ?>