Change list :: cBB Follower v2.0.6
Changes in Javascript files and external plugins are not included here.
acp/main_info.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -16,7 +16,7 @@
16
16
return [
17
17
'filename' => '\canidev\follower\acp\main_module',
18
18
'title' => 'ACP_FOLLOWER',
19
'version' => '2.0.5',
19
'version' => '2.0.6',
20
20
'modes' => [
21
21
'config' => ['title' => 'ACP_FOLLOWER_CONFIG', 'auth' => 'ext_canidev/follower && acl_a_board', 'cat' => ['ACP_CAT_FOLLOWER']],
22
22
'tools' => ['title' => 'ACP_FOLLOWER_TOOLS', 'auth' => 'ext_canidev/follower && acl_a_board', 'cat' => ['ACP_CAT_FOLLOWER']],
acp/main_module.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
composer.json
@@ -3,7 +3,7 @@
3
3
"type": "phpbb-extension",
4
4
"description": "",
5
5
"homepage": "https://www.canidev.com",
6
"version": "2.0.5",
6
"version": "2.0.6",
7
7
"keywords": ["phpbb", "extension", "canidev", "follower"],
8
8
"license": "CreativeCommons Attribution-NonCommercial v4.0",
9
9
"authors": [
controller/admin.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -84,7 +84,7 @@
84
84
'legend1' => 'ACP_FOLLOWER_CONFIG',
85
85
'fwr_default_profile' => ['lang' => 'FWR_DEFAULT_PROFILE', 'validate' => 'bool', 'type' => 'radio:yes_no'],
86
86
'fwr_user_popup' => ['lang' => 'FWR_USER_POPUP', 'validate' => 'int', 'type' => 'custom', 'function' => [$this->tools, 'make_select'], 'params' => [$popup_options, '{KEY}', '{CONFIG_VALUE}']],
87
'fwr_enable_mentions' => ['lang' => 'FWR_ENABLE_MENTIONS', 'validate' => 'bool', 'type' => 'radio:yes_no'],
87
'fwr_enable_mentions' => ['lang' => 'FWR_ENABLE_MENTIONS', 'validate' => 'bool', 'type' => 'radio:yes_no'],
88
88
'fwr_row_limit' => ['lang' => 'FWR_ROW_LIMIT', 'validate' => 'int:1:100', 'type' => 'text:4:3'],
89
89
'fwr_resize_images' => ['lang' => 'FWR_RESIZE_IMAGES', 'validate' => 'bool', 'type' => 'radio:yes_no'],
90
90
@@ -100,7 +100,7 @@
100
100
/**
101
101
* @event follower.acp_config_before
102
102
* @var array display_vars Array of config values to display and process
103
* @var boolean submit Do we display the form or process the submission
103
* @var bool submit Do we display the form or process the submission
104
104
* @var array cfg_array Data
105
105
* @var array error Array with submitted errors
106
106
* @since 2.0.0
@@ -117,7 +117,7 @@
117
117
}
118
118
119
119
// Do not write values if there is an error
120
if(sizeof($error))
120
if(count($error))
121
121
{
122
122
$submit = false;
123
123
}
@@ -141,7 +141,7 @@
141
141
/**
142
142
* @event follower.acp_config_after
143
143
* @var array display_vars Array of config values to display and process
144
* @var boolean submit Do we display the form or process the submission
144
* @var bool submit Do we display the form or process the submission
145
145
* @var array cfg_array Data
146
146
* @since 2.0.0
147
147
*/
@@ -188,13 +188,16 @@
188
188
$max_comment_id = (int)$this->db->sql_fetchfield('max_comment_id');
189
189
$this->db->sql_freeresult($result);
190
190
191
// Comments posted in own wall
191
192
while($start < $max_comment_id)
192
193
{
193
194
$sql = 'SELECT COUNT(comment_id) as stat, user_id
194
195
FROM ' . $this->tables['comments'] . '
195
196
WHERE comment_id BETWEEN ' . ($start + 1) . ' AND ' . ($start + $step) . '
196
197
AND parent_id = 0
197
GROUP BY user_id';
198
AND target_id = 0
199
GROUP BY user_id
200
HAVING stat > 0';
198
201
$result = $this->db->sql_query($sql);
199
202
200
203
if($row = $this->db->sql_fetchrow($result))
@@ -208,6 +211,38 @@
208
211
}
209
212
while($row = $this->db->sql_fetchrow($result));
210
213
}
214
215
$this->db->sql_freeresult($result);
216
217
$start += $step;
218
}
219
220
$start = 0;
221
222
// Comments posted in other walls
223
while($start < $max_comment_id)
224
{
225
$sql = 'SELECT COUNT(comment_id) as stat, target_id
226
FROM ' . $this->tables['comments'] . '
227
WHERE comment_id BETWEEN ' . ($start + 1) . ' AND ' . ($start + $step) . '
228
AND parent_id = 0
229
AND target_id <> 0
230
GROUP BY target_id
231
HAVING stat > 0';
232
$result = $this->db->sql_query($sql);
233
234
if($row = $this->db->sql_fetchrow($result))
235
{
236
do
237
{
238
$sql = 'UPDATE ' . USERS_TABLE . '
239
SET user_comments = user_comments + ' . $row['stat'] . '
240
WHERE user_id = ' . $row['target_id'];
241
$this->db->sql_query($sql);
242
}
243
while($row = $this->db->sql_fetchrow($result));
244
}
245
211
246
$this->db->sql_freeresult($result);
212
247
213
248
$start += $step;
@@ -261,7 +296,7 @@
261
296
'L_TITLE' => $this->language->lang($this->page_title),
262
297
'L_TITLE_EXPLAIN' => $this->language->lang($this->page_title . '_EXPLAIN'),
263
298
264
'S_ERROR' => sizeof($error) ? true : false,
299
'S_ERROR' => count($error) ? true : false,
265
300
'ERROR_MSG' => implode('<br />', $error),
266
301
]);
267
302
}
controller/main.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -267,7 +267,7 @@
267
267
$this->db->sql_freeresult($result);
268
268
269
269
// Get Comments
270
if(sizeof($comment_rows))
270
if(count($comment_rows))
271
271
{
272
272
$sql = 'SELECT *
273
273
FROM ' . $this->tables['comments'] . '
@@ -288,7 +288,7 @@
288
288
}
289
289
290
290
// Get Posts
291
if(sizeof($post_rows))
291
if(count($post_rows))
292
292
{
293
293
$sql = 'SELECT p.post_id, p.topic_id, p.forum_id, p.poster_id, p.post_subject, p.post_text, p.post_time, p.bbcode_uid, p.bbcode_bitfield
294
294
FROM ' . POSTS_TABLE . ' p
@@ -421,7 +421,7 @@
421
421
}
422
422
$this->db->sql_freeresult($result);
423
423
424
if(sizeof($user_ids))
424
if(count($user_ids))
425
425
{
426
426
// Check if I following this users
427
427
$sql = 'SELECT item_id
@@ -439,7 +439,7 @@
439
439
440
440
$this->template->assign_vars([
441
441
'S_SEARCH_TITLE' => $this->language->lang('RESULTS_USER', $keywords),
442
'S_KEYWORDS' => (($main_search) ? '@' : '') . $keywords,
442
'S_KEYWORDS' => '@' . $keywords,
443
443
'U_VIEW_ALL_COMMENTS' => $this->helper->route('canidev_follower_controller', [
444
444
'mode' => 'search',
445
445
'keywords' => urlencode($keywords),
controller/profile.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -143,10 +143,17 @@
143
143
trigger_error('NO_USER');
144
144
}
145
145
146
// In some cases the url can contain the "viewprofile" mode, redirect to the correct url
146
// In some cases the url can contain the "viewprofile" mode
147
147
if($mode == 'viewprofile')
148
148
{
149
return new RedirectResponse($this->follower->get_profile_url($member, ['mode' => 'wall']));
149
// GET Request will be redirected to the correct url
150
if(strtoupper($this->request->server('REQUEST_METHOD', 'GET')) == 'GET')
151
{
152
return new RedirectResponse($this->follower->get_profile_url($member, ['mode' => 'wall']));
153
}
154
155
// Other cases, use "wall" mode to catch events
156
$mode = 'wall';
150
157
}
151
158
152
159
$this->follower->set_service_option('userID', $u);
@@ -241,6 +248,26 @@
241
248
login_box('', $this->language->lang('LOGIN_EXPLAIN_VIEWPROFILE'));
242
249
}
243
250
251
if(!$myself && !$member['public_profile'] && !$this->auth->acl_get('m_fwr_view_private'))
252
{
253
$sql = 'SELECT friend
254
FROM ' . ZEBRA_TABLE . '
255
WHERE zebra_id = ' . $this->user->data['user_id'] . '
256
AND user_id = ' . $member['user_id'] . '
257
AND friend = 1';
258
$result = $this->db->sql_query($sql);
259
$user_is_friend = (bool)$this->db->sql_fetchfield('friend');
260
$this->db->sql_freeresult($result);
261
262
if(!$user_is_friend)
263
{
264
$message = $this->language->lang('ERROR_PRIVATE_PROFILE');
265
$message .= '<br><br>' . $this->language->lang('RETURN_INDEX', '<a href="' . append_sid($this->phpbb_root_path . 'index.' . $this->php_ext) . '">', '</a>');
266
267
trigger_error($message);
268
}
269
}
270
244
271
$page_title = $this->language->lang('VIEWING_PROFILE', $member['username']);
245
272
246
273
$actions = [
@@ -271,7 +298,7 @@
271
298
$skip = true;
272
299
}
273
300
274
// Skip the cronology if not allow to follow
301
// Skip the chronology if not allow to follow
275
302
if($action == 'home' && !$this->auth->acl_get('u_fwr_follow'))
276
303
{
277
304
$skip = true;
@@ -849,15 +876,14 @@
849
876
*/
850
877
function show_wall_profile($data, $user_notes_enabled = false, $warn_user_enabled = false)
851
878
{
852
$username = $data['username'];
853
$user_id = $data['user_id'];
879
$user_id = $data['user_id'];
854
880
855
881
$last_visit = $email = $age = '';
856
882
$online = false;
857
883
858
884
$user_rank_data = phpbb_get_user_rank($data, (($user_id == ANONYMOUS) ? false : $data['user_posts']));
859
885
860
if ((!empty($data['user_allow_viewemail']) && $this->auth->acl_get('u_sendemail')) || $this->auth->acl_get('a_user'))
886
if((!empty($data['user_allow_viewemail']) && $this->auth->acl_get('u_sendemail')) || $this->auth->acl_get('a_user'))
861
887
{
862
888
$email = ($this->config['board_email_form'] && $this->config['email_enable']) ? append_sid($this->phpbb_root_path . 'memberlist.' . $this->php_ext, 'mode=email&u=' . $user_id) : (($this->config['board_hide_emails'] && !$this->auth->acl_get('a_user')) ? '' : 'mailto:' . $data['user_email']);
863
889
}
@@ -931,20 +957,9 @@
931
957
include($this->phpbb_root_path . 'includes/functions_display.' . $this->php_ext);
932
958
933
959
$zebra_enabled = $friends_enabled = $foes_enabled = $user_notes_enabled = $warn_user_enabled = false;
960
$friend = $foe = false;
934
961
$profile_fields = [];
935
962
936
// What colour is the zebra
937
$sql = 'SELECT friend, foe
938
FROM ' . ZEBRA_TABLE . '
939
WHERE zebra_id = ' . $member['user_id'] . '
940
AND user_id = ' . $this->user->data['user_id'];
941
$result = $this->db->sql_query($sql);
942
$row = $this->db->sql_fetchrow($result);
943
$this->db->sql_freeresult($result);
944
945
$foe = $row ? (bool)$row['foe'] : false;
946
$friend = $row ? (bool)$row['friend'] : false;
947
948
963
if($this->config['load_onlinetrack'])
949
964
{
950
965
$sql = 'SELECT MAX(session_time) AS session_time, MIN(session_viewonline) AS session_viewonline
@@ -978,6 +993,18 @@
978
993
$friends_enabled = $module->loaded('ucp_zebra', 'friends');
979
994
$foes_enabled = $module->loaded('ucp_zebra', 'foes');
980
995
996
// What colour is the zebra
997
$sql = 'SELECT friend, foe
998
FROM ' . ZEBRA_TABLE . '
999
WHERE zebra_id = ' . $member['user_id'] . '
1000
AND user_id = ' . $this->user->data['user_id'];
1001
$result = $this->db->sql_query($sql);
1002
$row = $this->db->sql_fetchrow($result);
1003
$this->db->sql_freeresult($result);
1004
1005
$foe = $row ? (bool)$row['foe'] : false;
1006
$friend = $row ? (bool)$row['friend'] : false;
1007
981
1008
unset($module);
982
1009
}
983
1010
@@ -1112,20 +1139,20 @@
1112
1139
'U_FOLLOWING' => $this->follower->get_profile_url($member, ['mode' => 'following']),
1113
1140
'U_FOLLOWERS' => $this->follower->get_profile_url($member, ['mode' => 'followers']),
1114
1141
1115
'OCCUPATION' => (!empty($member['user_occ'])) ? censor_text($member['user_occ']) : '',
1116
'INTERESTS' => (!empty($member['user_interests'])) ? censor_text($member['user_interests']) : '',
1142
'OCCUPATION' => !empty($member['user_occ']) ? censor_text($member['user_occ']) : '',
1143
'INTERESTS' => !empty($member['user_interests']) ? censor_text($member['user_interests']) : '',
1117
1144
1118
'S_USER_NOTES' => ($user_notes_enabled) ? true : false,
1119
'S_WARN_USER' => ($warn_user_enabled) ? true : false,
1120
'S_ZEBRA' => (!$myself && $this->user->data['is_registered'] && $zebra_enabled) ? true : false,
1121
'U_ADD_FRIEND' => (!$friend && !$foe && $friends_enabled) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
1122
'U_ADD_FOE' => (!$friend && !$foe && $foes_enabled) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&mode=foes&add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
1123
'U_REMOVE_FRIEND' => ($friend && $friends_enabled) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&remove=1&usernames[]=' . $member['user_id']) : '',
1124
'U_REMOVE_FOE' => ($foe && $foes_enabled) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&remove=1&mode=foes&usernames[]=' . $member['user_id']) : '',
1145
'S_USER_NOTES' => $user_notes_enabled,
1146
'S_WARN_USER' => $warn_user_enabled,
1147
'S_ZEBRA' => (!$myself && ($friends_enabled || $foes_enabled)),
1148
'U_ADD_FRIEND' => ($friends_enabled && !$friend && !$foe) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
1149
'U_ADD_FOE' => ($foes_enabled && !$friend && !$foe) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&mode=foes&add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
1150
'U_REMOVE_FRIEND' => ($friends_enabled && $friend) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&remove=1&usernames[]=' . $member['user_id']) : '',
1151
'U_REMOVE_FOE' => ($foes_enabled && $foe) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'i=zebra&remove=1&mode=foes&usernames[]=' . $member['user_id']) : '',
1125
1152
1126
'U_USER_ADMIN' => ($this->auth->acl_get('a_user')) ? append_sid($this->phpbb_root_path . 'adm/index.' . $this->php_ext, 'i=users&mode=overview&u=' . $member['user_id'], true, $this->user->session_id) : '',
1153
'U_USER_ADMIN' => $this->auth->acl_get('a_user') ? append_sid($this->phpbb_root_path . 'adm/index.' . $this->php_ext, 'i=users&mode=overview&u=' . $member['user_id'], true, $this->user->session_id) : '',
1127
1154
'U_USER_BAN' => ($this->auth->acl_get('m_ban') && !$myself) ? append_sid($this->phpbb_root_path . 'mcp.' . $this->php_ext, 'i=ban&mode=user&u=' . $member['user_id'], true, $this->user->session_id) : '',
1128
'U_MCP_QUEUE' => ($this->auth->acl_getf_global('m_approve')) ? append_sid($this->phpbb_root_path . 'mcp.' . $this->php_ext, 'i=queue', true, $this->user->session_id) : '',
1155
'U_MCP_QUEUE' => $this->auth->acl_getf_global('m_approve') ? append_sid($this->phpbb_root_path . 'mcp.' . $this->php_ext, 'i=queue', true, $this->user->session_id) : '',
1129
1156
'U_SWITCH_PERMISSIONS' => ($this->auth->acl_get('a_switchperm') && !$myself) ? append_sid($this->phpbb_root_path . 'ucp.' . $this->php_ext, 'mode=switch_perm&u=' . $member['user_id'] . '&hash=' . generate_link_hash('switchperm')) : '',
1130
1157
]);
1131
1158
}
@@ -1176,7 +1203,7 @@
1176
1203
// Get following by member
1177
1204
$following_users = $this->get_following_users($member);
1178
1205
1179
if(sizeof($following_users))
1206
if(count($following_users))
1180
1207
{
1181
1208
$ignore_users = array_merge($ignore_users, $following_users);
1182
1209
@@ -1225,7 +1252,7 @@
1225
1252
}
1226
1253
$this->db->sql_freeresult($result);
1227
1254
1228
if(!sizeof($user_list))
1255
if(!count($user_list))
1229
1256
{
1230
1257
return false;
1231
1258
}
controller/unsubscribe.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
cron/birthdays.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
cron/tiny.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
event/listener.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -388,6 +388,7 @@
388
388
'item_title' => $topic_data['topic_title'],
389
389
'parent_id' => $topic_data['topic_id'],
390
390
'poster_id' => $topic_data['topic_poster'],
391
'post_time' => $topic_data['topic_time'],
391
392
];
392
393
393
394
$notification_data = $this->parse_post_for_notify($topic_data);
@@ -517,6 +518,7 @@
517
518
$this->template->assign_vars([
518
519
'S_ABOUTME' => $this->user_data['about_me'],
519
520
'S_HEADER_IMAGE_SELECTOR' => $media->buildSelector('header_image', 'image', $this->user_data['header_image']),
521
'S_PUBLIC_PROFILE' => (bool)$this->user_data['public_profile'],
520
522
]);
521
523
}
522
524
@@ -530,6 +532,7 @@
530
532
$data = $event['data'];
531
533
$error = $event['error'];
532
534
535
$data['public_profile'] = $this->request->variable('public_profile', 1);
533
536
$data['aboutme'] = $this->request->variable('aboutme', '', true);
534
537
$data['header_image'] = $this->request->variable('header_image', '');
535
538
$data['header_image_id'] = $this->request->variable('header_image_media_id', 0);
@@ -542,6 +545,7 @@
542
545
$this->template->assign_vars([
543
546
'S_ABOUTME' => $data['aboutme'],
544
547
'S_HEADER_IMAGE_SELECTOR' => $this->container->get('canidev.follower.tools')->get_media()->buildSelector('header_image', 'image', $data['header_image']),
548
'S_PUBLIC_PROFILE' => (bool)$data['public_profile'],
545
549
]);
546
550
}
547
551
@@ -580,6 +584,7 @@
580
584
}
581
585
582
586
$this->container->get('canidev.follower.tools')->save_user_extra_data($this->user->data['user_id'], [
587
'public_profile' => $event['data']['public_profile'],
583
588
'about_me' => $event['data']['aboutme'],
584
589
'header_image' => $event['data']['header_image'],
585
590
'header_image_id' => $event['data']['header_image_id'],
@@ -866,7 +871,7 @@
866
871
* Add permissions to manage the Extension
867
872
*
868
873
* @param \phpbb\event\data $event
869
*/
874
*/
870
875
public function add_permissions($event)
871
876
{
872
877
$event['categories'] = array_merge($event['categories'], [
@@ -874,7 +879,8 @@
874
879
]);
875
880
876
881
$event['permissions'] = array_merge($event['permissions'], [
877
'm_fwr_manage' => ['lang' => 'ACL_M_FOLLOWER_MANAGE', 'cat' => 'follower'],
882
'm_fwr_manage' => ['lang' => 'ACL_M_FOLLOWER_MANAGE', 'cat' => 'follower'],
883
'm_fwr_view_private' => ['lang' => 'ACL_M_FOLLOWER_VIEW_PRIVATE', 'cat' => 'follower'],
878
884
879
885
'u_fwr_publish' => ['lang' => 'ACL_U_FWR_PUBLISH', 'cat' => 'follower'],
880
886
'u_fwr_interaction' => ['lang' => 'ACL_U_FWR_INTERACTION', 'cat' => 'follower'],
event/media.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -134,6 +134,7 @@
134
134
$sql = 'INSERT INTO ' . $this->tables['data'] . $this->db->sql_build_array('INSERT', $image_data);
135
135
$this->db->sql_query($sql);
136
136
137
/** @disregard P1007 Deprecated */
137
138
$rowset['id'] = (int)$this->db->sql_nextid();
138
139
139
140
$event['rowset'] = $rowset;
ext.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -12,7 +12,7 @@
12
12
class ext extends \phpbb\extension\base
13
13
{
14
14
const REQUIRED_PHPBB = '3.2.0';
15
const REQUIRED_CORE = '1.1.8';
15
const REQUIRED_CORE = '1.1.10';
16
16
17
17
/**
18
18
* {@inheritDoc}
language/en/common.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [English [En]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -27,19 +27,19 @@
27
27
'COPY_COMMENT_LINK' => 'Copy comment link',
28
28
'FOLLOW' => 'Follow',
29
29
'FOLLOWING' => 'Following',
30
'FOLLOWING_BY' => 'Follow by %s',
30
'FOLLOWING_BY' => 'Followed by %s',
31
31
'FOLLOWER' => 'User Follower',
32
32
'FOLLOWERS' => 'Followers',
33
'FWR_HOME' => 'Cronology',
33
'FWR_HOME' => 'Chronology',
34
34
'FWR_REPLY' => 'Reply',
35
35
'FWR_REPLY_PLACEHOLDER' => 'Reply...',
36
36
'LIKE' => 'Like',
37
'LIKE_UNDO' => 'No like',
37
'LIKE_UNDO' => 'Unlike',
38
38
'LOAD_MORE' => 'Load more',
39
39
'MENTIONS' => 'Mentions',
40
40
'MENTION_USER' => 'Mention user',
41
'NO_COMMENT' => 'The selected comment no exists',
42
'NO_ITEMS' => 'No elements to show',
41
'NO_COMMENT' => 'The selected comment does not exists',
42
'NO_ITEMS' => 'No items to show',
43
43
'NO_RESULTS' => 'No results',
44
44
'PUBLISH' => 'Publish',
45
45
'RECENT_ACTIVITY' => 'Recent Activity',
@@ -47,17 +47,17 @@
47
47
'RESULTS_USER' => '<strong>Users:</strong> <em>%s</em>',
48
48
'SEARCH_RESULTS' => 'Search results',
49
49
'SHARE' => 'Share',
50
'SHARE_UNDO' => 'No Share',
50
'SHARE_UNDO' => 'Unshare',
51
51
'SHARED_BY' => 'Shared by %s',
52
52
'SOMEBODY' => 'Somebody',
53
53
'TITLE_FOLLOWING' => 'People who follow %s',
54
54
'TITLE_FOLLOWERS' => 'People that follow %s',
55
55
'TITLE_POSTS' => 'Posts posted by %s',
56
56
'TITLE_TOPICS' => 'Topics published by %s',
57
'TITLE_WALL' => 'Wall of %s',
57
'TITLE_WALL' => '%s\'s Wall',
58
58
'TRENDS' => 'Trends',
59
'UNFOLLOW' => 'No Follow',
60
'UNSHARE' => 'No Share',
59
'UNFOLLOW' => 'Unfollow',
60
'UNSHARE' => 'Unshare',
61
61
'USER_INFO' => 'About %s',
62
62
'USER_WALL' => 'User wall',
63
63
'USUAL_POSTER' => 'Usual poster',
@@ -77,14 +77,14 @@
77
77
'EMPTY_MY_MENTIONS' => 'Here you will see the comments or messages in which your name is mentioned.',
78
78
'EMPTY_MY_POSTS' => 'Here you will see the messages posted in the forum.',
79
79
'EMPTY_MY_TOPICS' => 'Here you will see the topics created in the forum.',
80
'EMPTY_MY_WALL' => 'This is your personal wall<br />Here your comments will be displayed.',
80
'EMPTY_MY_WALL' => 'This is your personal wall<br />Your comments will be displayed here.',
81
81
'EMPTY_MY_WALL_NO_AUTH' => '<em>You do not have permission to post comments</em>.',
82
82
83
83
'EMPTY_OTHER_FOLLOWERS' => 'Nobody follows %s yet.',
84
'EMPTY_OTHER_FOLLOWING' => '%s still does not follow anyone.',
85
'EMPTY_OTHER_POSTS' => '%s has not written any message yet.',
86
'EMPTY_OTHER_TOPICS' => '% s has not created any topic yet.',
87
'EMPTY_OTHER_WALL' => '% s has not shared anything yet.',
84
'EMPTY_OTHER_FOLLOWING' => '%s does not follow anyone.',
85
'EMPTY_OTHER_POSTS' => '%s has not written any messages yet.',
86
'EMPTY_OTHER_TOPICS' => '%s has not created any topics yet.',
87
'EMPTY_OTHER_WALL' => '%s has not shared anything yet.',
88
88
89
89
'LINK_CLIPBOARD_ERROR' => 'The link could not be copied',
90
90
'LINK_CLIPBOARD_SUCCESS' => 'Link copied to clipboard',
@@ -92,21 +92,23 @@
92
92
'POST_ROW' => '<span style="font-weight:bold;font-size:0.9em;">Post:</span> <a href="%1$s">%2$s</a><br /><span class="row-small">%3$s</span>',
93
93
'TOPIC_ROW' => '<span style="font-weight:bold;font-size:0.9em;">Topic:</span> <a href="%1$s">%2$s</a><br /><span class="row-small"> » In <a href="%3$s">%4$s</a></span>',
94
94
95
'ERROR_PRIVATE_PROFILE' => 'The profile you are trying to access is private. You must request the user permission to view it.',
96
95
97
// Notifications
96
'FW_NOTIFICATION_BIRTHDAY' => '<strong>Today is the birthday of %s</strong><br />Write something on his wall to congratulate it',
98
'FW_NOTIFICATION_BIRTHDAY' => '<strong>Today is %s\'s birthday!</strong><br />Write something on his wall to congratulate it',
97
99
98
100
'FW_NOTIFICATION_COMMENT' => [
99
1 => '%s posted a comment on his wall',
101
1 => '%s posted a comment on their wall',
100
102
2 => '%s posted a comment on their wall',
101
103
],
102
104
103
'FW_NOTIFICATION_FOLLOW' => '%s has started to follow you',
104
'FW_NOTIFICATION_MENTION_COMMENT' => '%s mentioned you in a message on his wall',
105
'FW_NOTIFICATION_FOLLOW' => '%s has started following you',
106
'FW_NOTIFICATION_MENTION_COMMENT' => '%s mentioned you in a message on their wall',
105
107
'FW_NOTIFICATION_MENTION_POST' => '%s has mentioned you in the topic:',
106
108
107
109
'FW_NOTIFICATION_LIKE_COMMENT' => [
108
1 => '%s liked a comment of yours',
109
2 => '%s liked a comment of yours',
110
1 => '%s liked your comment',
111
2 => '%s liked your comment',
110
112
],
111
113
112
114
'FW_NOTIFICATION_LIKE_POST' => [
@@ -114,14 +116,14 @@
114
116
2 => '%s liked a message you posted',
115
117
],
116
118
117
'FW_NOTIFICATION_REPLY' => '%s has replied to a comment on your wall',
119
'FW_NOTIFICATION_REPLY' => '%s has replied to a comment on your wall',
118
120
119
121
'FW_NOTIFICATION_SHARE' => [
120
122
1 => '%s has shared a comment on your wall',
121
123
2 => '%s have shared a comment on your wall',
122
124
],
123
125
124
'SUBSCRIPTION_REMOVED' => 'The subscription has been removed successfully.',
126
'SUBSCRIPTION_REMOVED' => 'The subscription has been removed successfully.',
125
127
126
128
// Install
127
129
'CORE_INSTALL_ERROR' => 'You have not uploaded all the files from the installation package or you are trying to install an old package.<br />
language/en/email/birthday_notify.txt
@@ -1,8 +1,8 @@
1
Subject: New Birthday
1
Subject: New Birthday!
2
2
3
3
Hi,
4
4
5
Today is the birthday of {FOLLOWER_NAME}.
5
Today is the {FOLLOWER_NAME}'s birthday!
6
6
7
7
To see the user's profile, use this link:
8
8
{U_ITEM_LINK}
language/en/email/comment_notify.txt
@@ -1,4 +1,4 @@
1
Subject: They have posted on their profile
1
Subject: Someone posted on your profile!
2
2
3
3
Hi,
4
4
language/en/email/follow_notify.txt
@@ -1,8 +1,8 @@
1
Subject: New follower
1
Subject: You have a new follower!
2
2
3
3
Hi,
4
4
5
{FOLLOWER_NAME} has started to follow you in "{SITENAME}".
5
{FOLLOWER_NAME} Started following you on "{SITENAME}".
6
6
7
7
To see the user's profile, use this link:
8
8
{U_ITEM_LINK}
language/en/email/like_notify.txt
@@ -1,8 +1,8 @@
1
Subject: Your received a new Like
1
Subject: Your received a new Like!
2
2
3
3
Hi,
4
4
5
"{AUTHOR_NAME}" has indicated that he likes a message from you in "{SITENAME}".
5
"{AUTHOR_NAME}" likes your message on "{SITENAME}".
6
6
7
7
To see the message, use this link:
8
8
{U_ITEM_LINK}
language/en/email/mention_notify.txt
@@ -1,4 +1,4 @@
1
Subject: You have been mentioned
1
Subject: You have been mentioned!
2
2
3
3
Hi,
4
4
language/en/email/post_notify.txt
@@ -1,4 +1,4 @@
1
Subject: New message from {AUTHOR_NAME}
1
Subject: New message from {AUTHOR_NAME}!
2
2
3
3
Hi,
4
4
language/en/email/reply_notify.txt
@@ -1,8 +1,8 @@
1
Subject: New response to your comment
1
Subject: Someone replied to your comment!
2
2
3
3
Hi,
4
4
5
"{AUTHOR_NAME}" has responded to a comment from you on "{SITENAME}".
5
"{AUTHOR_NAME}" has responded to your comment on "{SITENAME}".
6
6
7
7
To see the reply, use this link:
8
8
{U_ITEM_LINK}
language/en/email/share_notify.txt
@@ -1,8 +1,8 @@
1
Subject: {USERNAME} shared your comment
1
Subject: {USERNAME} shared your message!
2
2
3
3
Hi,
4
4
5
"{USERNAME}" shared a comment from you on "{SITENAME}".
5
"{USERNAME}" shared your message on "{SITENAME}".
6
6
7
7
To see the comment, use this link:
8
8
{U_ITEM_LINK}
language/en/email/topic_notify.txt
@@ -1,8 +1,8 @@
1
Subject: New topic from {AUTHOR_NAME}
1
Subject: New topic from {AUTHOR_NAME}!
2
2
3
3
Hi,
4
4
5
"{AUTHOR_NAME}" posted a new topic in "{SITENAME}".
5
"{AUTHOR_NAME}" posted a new topic on "{SITENAME}".
6
6
7
7
To see the created topic, use this link:
8
8
{U_ITEM_LINK}
language/en/info_acp_follower.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [English [En]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -27,7 +27,7 @@
27
27
28
28
'ACP_FOLLOWER_COMMENTS' => 'Comment settings',
29
29
'ACP_FOLLOWER_CONFIG' => 'Main configuration',
30
'ACP_FOLLOWER_CONFIG_EXPLAIN' => 'Thank you for choosing cBB Follower as a complement to your forum! <br /> From this page you can modify the main characteristics of the user follower.',
30
'ACP_FOLLOWER_CONFIG_EXPLAIN' => 'Thank you for choosing cBB Follower as a complement to your forum! <br /> From this page you can modify the main settings of the user follower.',
31
31
'ACP_FOLLOWER_TOOLS' => 'Tools',
32
32
'ACP_FOLLOWER_TOOLS_EXPLAIN' => 'Here you will find additional tools for the administration of the extension.',
33
33
@@ -57,7 +57,7 @@
57
57
'FWR_STORE_TIME' => 'Save user comments',
58
58
'FWR_STORE_TIME_EXPLAIN' => 'If a time limit is set, comments that are outside that limit will be automatically deleted.',
59
59
'FWR_USER_POPUP' => 'Show floating information box',
60
'FWR_USER_POPUP_EXPLAIN' => 'Determines in what circumstances a floating box with user information will be displayed when the mouse moves over its name.',
60
'FWR_USER_POPUP_EXPLAIN' => 'Determines where a floating information box will be displayed when the mouse moves over a username.',
61
61
62
62
'LOG_FWR_CONFIG' => '<strong>cBB Follower</strong> Modified main configuration',
63
63
'LOG_FWR_RESYNC_COMMENTS' => '<strong>cBB Follower</strong> Synchronized comments',
language/en/info_ucp_follower.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [English [En]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -22,19 +22,21 @@
22
22
$lang = array_merge($lang, [
23
23
'ABOUTME' => 'About me',
24
24
'ABOUTME_EXPLAIN' => 'Small text (max 500 characters), visible by other users.',
25
'ERROR_ABOUTME_TOO_LONG' => 'The "About me" field contains more characters than allowed',
25
'ERROR_ABOUTME_TOO_LONG' => 'The "About me" field contains too many characters.',
26
26
'HEADER_IMAGE' => 'Profile image',
27
'HEADER_IMAGE_EXPLAIN' => 'Image that will be displayed as the background of the header of your profile.',
27
'HEADER_IMAGE_EXPLAIN' => 'Image that will be displayed as the background of your profile header.',
28
'PUBLIC_PROFILE' => 'Public profile',
29
'PUBLIC_PROFILE_EXPLAIN' => 'If enabled, all users with administration permission will be able to see your wall, otherwise, only users added as "Friend" will be able to see it.',
28
30
29
31
// Notifications
30
32
'NOTIFICATION_GROUP_FOLLOWER' => 'User follower notifications',
31
33
'FW_NOTIFICATION_TYPE_BIRTHDAY' => 'Someone you follow has a birthday',
32
'FW_NOTIFICATION_TYPE_COMMENT' => 'Someone post a comment on your wall',
33
'FW_NOTIFICATION_TYPE_FOLLOW' => 'Someone follow you',
34
'FW_NOTIFICATION_TYPE_LIKE' => 'Someone likes a comment or message from you',
35
'FW_NOTIFICATION_TYPE_MENTION' => 'Someone mentioned in a comment or message',
36
'FW_NOTIFICATION_TYPE_POST' => 'Someone you follow post a message',
37
'FW_NOTIFICATION_TYPE_REPLY' => 'Someone respond to a comment on your wall',
38
'FW_NOTIFICATION_TYPE_SHARE' => 'Someone share a comment on your wall',
39
'FW_NOTIFICATION_TYPE_TOPIC' => 'Someone you follow posting a topic',
34
'FW_NOTIFICATION_TYPE_COMMENT' => 'Someone posted a comment on your wall',
35
'FW_NOTIFICATION_TYPE_FOLLOW' => 'Someone is following you',
36
'FW_NOTIFICATION_TYPE_LIKE' => 'Someone likes your comment or message',
37
'FW_NOTIFICATION_TYPE_MENTION' => 'Someone mentioned you in a comment or message',
38
'FW_NOTIFICATION_TYPE_POST' => 'Someone you follow posted a message',
39
'FW_NOTIFICATION_TYPE_REPLY' => 'Someone replied to a comment on your wall',
40
'FW_NOTIFICATION_TYPE_SHARE' => 'Someone shared a comment on your wall',
41
'FW_NOTIFICATION_TYPE_TOPIC' => 'Someone you follow posted a topic',
40
42
]);
language/en/permissions_follower.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [English [En]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -24,9 +24,10 @@
24
24
25
25
'ACL_U_FWR_FOLLOW' => 'Can follow users',
26
26
'ACL_U_FWR_INTERACTION' => 'Can share and rate comments and messages',
27
'ACL_U_FWR_MANAGE' => 'Can edit/delete the comments of their wall',
27
'ACL_U_FWR_MANAGE' => 'Can edit/delete the comments on their wall',
28
28
'ACL_U_FWR_MENTION' => 'Can mention users',
29
'ACL_U_FWR_PUBLISH' => 'Can publish commens on their wall',
29
'ACL_U_FWR_PUBLISH' => 'Can publish comments on their wall',
30
30
31
'ACL_M_FOLLOWER_MANAGE' => 'Can edit/delete comments',
31
'ACL_M_FOLLOWER_MANAGE' => 'Can edit/delete comments',
32
'ACL_M_FOLLOWER_VIEW_PRIVATE' => 'Can view private profiles',
32
33
]);
language/es/common.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [Spanish [Es]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -92,6 +92,8 @@
92
92
'POST_ROW' => '<span style="font-weight:bold;font-size:0.9em;">Mensaje:</span> <a href="%1$s">%2$s</a><br /> <span class="row-small">%3$s</span>',
93
93
'TOPIC_ROW' => '<span style="font-weight:bold;font-size:0.9em;">Tema:</span> <a href="%1$s">%2$s</a><br /><span class="row-small"> » En <a href="%3$s">%4$s</a></span>',
94
94
95
'ERROR_PRIVATE_PROFILE' => 'El perfil al que intenta acceder es privado. Debe solicitar permiso al usuario para poder verlo.',
96
95
97
// Notifications
96
98
'FW_NOTIFICATION_BIRTHDAY' => '<strong>Hoy es el cumpleaños de %s</strong><br />Escriba algo en su muro para felicitarlo/a',
97
99
language/es/info_acp_follower.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [Spanish [Es]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
language/es/info_ucp_follower.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [Spanish [Es]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -25,6 +25,8 @@
25
25
'ERROR_ABOUTME_TOO_LONG' => 'El campo "Acerca de mí" contiene más caracteres de los permitidos',
26
26
'HEADER_IMAGE' => 'Imagen de perfil',
27
27
'HEADER_IMAGE_EXPLAIN' => 'Imagen que se mostrará como fondo de la cabecera de su perfil.',
28
'PUBLIC_PROFILE' => 'Perfil público',
29
'PUBLIC_PROFILE_EXPLAIN' => 'Si se habilita, todos los usuarios con permiso de la administración podrán ver su muro, en caso contrario, solo los usuarios añadidos como "Amigo" podrán verlo.',
28
30
29
31
// Notifications
30
32
'NOTIFICATION_GROUP_FOLLOWER' => 'Notificaciones del seguidor de usuarios',
language/es/permissions_follower.php
@@ -2,9 +2,9 @@
2
2
/**
3
3
* [Spanish [Es]]
4
4
* @package cBB Follower
5
* @version 2.0.5 21/10/2024
5
* @version 2.0.6 24/02/2025
6
6
*
7
* @copyright (c) 2024 CaniDev
7
* @copyright (c) 2025 CaniDev
8
8
* @license https://creativecommons.org/licenses/by-nc/4.0/
9
9
*/
10
10
@@ -28,5 +28,6 @@
28
28
'ACL_U_FWR_MENTION' => 'Puede mencionar a usuarios',
29
29
'ACL_U_FWR_PUBLISH' => 'Puede publicar comentarios en su muro',
30
30
31
'ACL_M_FOLLOWER_MANAGE' => 'Puede editar/borrar los comentarios de los usuarios',
31
'ACL_M_FOLLOWER_MANAGE' => 'Puede editar/borrar los comentarios de los usuarios',
32
'ACL_M_FOLLOWER_VIEW_PRIVATE' => 'Puede ver perfiles privados',
32
33
]);
libraries/ajax.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -89,15 +89,15 @@
89
89
{
90
90
$wall_row = $user_cache = $track_cache_ids = [];
91
91
92
$action = $this->request->variable('action', '');
93
$id = $this->request->variable('id', 0);
94
$parent_id = $this->request->variable('parent_id', 0);
95
$start = $this->request->variable('start', 0);
96
$u = $this->request->variable('u', 0);
97
$mode = $this->request->variable('mode', 'wall');
92
$action = $this->request->variable('action', '');
93
$id = $this->request->variable('id', 0);
94
$parent_id = $this->request->variable('parent_id', 0);
95
$start = $this->request->variable('start', 0);
96
$u = $this->request->variable('u', 0);
97
$mode = $this->request->variable('mode', 'wall');
98
98
99
99
$row_limit = (int)$this->config['fwr_row_limit'];
100
$myself = ($u == $this->user->data['user_id']) ? true : false;
100
$myself = ($u == $this->user->data['user_id']);
101
101
$template_filename = '@canidev_follower/follower_body.html';
102
102
103
103
$json = [
@@ -124,6 +124,7 @@
124
124
case 'unfollow':
125
125
if(!$this->auth->acl_get('u_fwr_follow') || $id == $this->user->data['user_id'])
126
126
{
127
$action = '';
127
128
break;
128
129
}
129
130
@@ -195,6 +196,7 @@
195
196
case 'delete':
196
197
if(!$comment_row || $this->request->variable('type', '') != 'comment')
197
198
{
199
$action = '';
198
200
break;
199
201
}
200
202
@@ -205,6 +207,7 @@
205
207
if(!$this->auth->acl_get('m_fwr_manage') &&
206
208
!($is_mine && $this->auth->acl_get('u_fwr_manage')))
207
209
{
210
$action = '';
208
211
break;
209
212
}
210
213
@@ -226,13 +229,14 @@
226
229
$member_comments = (int)$this->db->sql_fetchfield('user_comments');
227
230
$this->db->sql_freeresult($result);
228
231
229
$json['commentCount'] = $member_comments - $info['substracts'][$target_id];
232
$json['commentCount'] = $member_comments;
230
233
}
231
234
break;
232
235
233
236
case 'edit':
234
237
if(!$comment_row)
235
238
{
239
$action = '';
236
240
break;
237
241
}
238
242
@@ -287,6 +291,7 @@
287
291
case 'post':
288
292
if($action == 'post' && (!$this->auth->acl_get('u_fwr_publish') || ($parent_id && !$comment_row)))
289
293
{
294
$action = '';
290
295
break;
291
296
}
292
297
@@ -298,7 +303,13 @@
298
303
if($message || count($attach_ids))
299
304
{
300
305
$uid = $bitfield = $options = '';
301
generate_text_for_storage($message, $uid, $bitfield, $options, true, true, true, false, false, false, true, 'follower');
306
307
if(!$this->config['fwr_advanced_comments'])
308
{
309
$message = preg_replace(['#\[img[^\]]*\]#', '#\[/img\]#'], '', $message);
310
}
311
312
generate_text_for_storage($message, $uid, $bitfield, $options, true, true, true, (bool)$this->config['fwr_advanced_comments'], false, false, true, 'follower');
302
313
303
314
$sql_ary = [
304
315
'comment_text' => $message,
@@ -331,6 +342,7 @@
331
342
$sql = 'INSERT INTO ' . $this->tables['comments'] . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
332
343
$this->db->sql_query($sql);
333
344
345
/** @disregard P1007 Deprecated */
334
346
$comment_id = (int)$this->db->sql_nextid();
335
347
336
348
if($is_reply)
@@ -350,7 +362,6 @@
350
362
}
351
363
352
364
// Save mentions and hashtags
353
$mention_ary = [];
354
365
$mention_ary = $this->follower->store_mentions('comment', $comment_id, $sql_ary);
355
366
$this->follower->store_hashtags('comment', $comment_id, $sql_ary);
356
367
@@ -416,6 +427,7 @@
416
427
case 'share':
417
428
if(!$this->auth->acl_get('u_fwr_interaction') || !$comment_row)
418
429
{
430
$action = '';
419
431
break;
420
432
}
421
433
@@ -481,6 +493,7 @@
481
493
case 'like':
482
494
if(!$this->auth->acl_get('u_fwr_interaction'))
483
495
{
496
$action = '';
484
497
break;
485
498
}
486
499
@@ -521,6 +534,7 @@
521
534
522
535
if(!$item_row)
523
536
{
537
$action = '';
524
538
break;
525
539
}
526
540
@@ -656,33 +670,56 @@
656
670
657
671
if(!$user_row)
658
672
{
673
$action = '';
659
674
break;
660
675
}
661
676
677
$json['isValidUser'] = true;
678
662
679
$user_row += $this->tools->get_user_extra_data($id);
663
680
681
$counters = [
682
'POSTS' => $user_row['user_posts'],
683
'COMMENTS' => $user_row['user_comments'],
684
'FOLLOWERS' => $user_row['user_followers']
685
];
686
664
687
$this->template->assign_vars([
665
688
'S_USERINFO' => true,
666
689
'S_AVATAR_IMG' => phpbb_get_user_avatar($user_row),
667
690
'S_USERNAME' => $user_row['username'],
668
691
669
692
'S_USER_DESCRIPTION' => bbcode_nl2br($user_row['about_me']),
670
'S_USER_COMMENTS' => $user_row['user_comments'],
671
'S_USER_FOLLOWERS' => $user_row['user_followers'],
672
'S_USER_POSTS' => $user_row['user_posts'],
673
693
674
694
'S_FOLLOW_BUTTON' => $this->follower->create_button('follow_button', [
675
695
'USER_ID' => $user_row['user_id'],
676
696
'USER_STATUS' => ($user_row['item_id']) ? 'following' : 'follow',
677
]),
697
]),
678
698
]);
679
699
680
$json['isValidUser'] = true;
700
/**
701
* @event follower.load_user_info
702
* @var array user_row User data
703
* @var array counters User counters to display
704
* @var array json Output json parameters
705
* @since 2.0.6
706
*/
707
$vars = ['user_row', 'counters', 'json'];
708
extract($this->dispatcher->trigger_event('follower.load_user_info', compact($vars)));
709
710
foreach($counters as $lang_key => $value)
711
{
712
$this->template->assign_block_vars('user_counters', [
713
'LABEL' => $this->language->lang($lang_key),
714
'VALUE' => $value,
715
]);
716
}
681
717
break;
682
718
683
719
case 'finduser':
684
720
if(!$this->auth->acl_get('u_fwr_mention'))
685
721
{
722
$action = '';
686
723
break;
687
724
}
688
725
@@ -823,8 +860,10 @@
823
860
protected function add_notification($notification_type_name, $notification_data)
824
861
{
825
862
$notification_type_id = $this->notifications->get_notification_type_id($notification_type_name);
826
$notification = $this->notifications->get_item_type_class($notification_type_name);
827
863
$item_parent_id = isset($notification_data['item_parent_id']) ? $notification_data['item_parent_id'] : 0;
864
865
/** @var \canidev\follower\notification\base */
866
$notification = $this->notifications->get_item_type_class($notification_type_name);
828
867
829
868
$time = $this->user->create_datetime();
830
869
$time->setTime(0, 0, 0);
libraries/constants.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
libraries/follower.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -192,7 +192,7 @@
192
192
}
193
193
$this->db->sql_freeresult($result);
194
194
195
if(sizeof($following_user_ids))
195
if(count($following_user_ids))
196
196
{
197
197
$sql = 'DELETE FROM ' . $this->tables['track'] . '
198
198
WHERE user_id = ' . $this->user->data['user_id'] . '
@@ -220,7 +220,7 @@
220
220
*/
221
221
public function footer()
222
222
{
223
if(!sizeof($this->service_options))
223
if(!count($this->service_options))
224
224
{
225
225
return;
226
226
}
@@ -354,7 +354,7 @@
354
354
$mentions[] = (int)$user_id;
355
355
}
356
356
357
if(sizeof($sql_ary))
357
if(count($sql_ary))
358
358
{
359
359
$this->db->sql_multi_insert($this->tables['data'], $sql_ary);
360
360
}
@@ -476,9 +476,14 @@
476
476
477
477
if($node->nodeValue != $new_string)
478
478
{
479
$new_string = preg_replace_callback('#^(.*?)(<a.*?>.*?</a>)(.*?)$#', function($matches) {
480
return htmlentities($matches[1]) . $matches[2] . htmlentities($matches[3]);
481
}, $new_string);
479
$new_string = implode('',
480
array_map(
481
function($part) {
482
return substr($part, 0, 2) == '<a' ? $part : htmlentities($part);
483
},
484
preg_split('#(<a.*?>.*?</a>)#', $new_string, -1, PREG_SPLIT_DELIM_CAPTURE)
485
)
486
);
482
487
483
488
$tmp_doc = Dom::loadXML('<span>' . $new_string . '</span>');
484
489
libraries/tools.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -138,7 +138,7 @@
138
138
139
139
$attachment_ary = [];
140
140
141
if(sizeof($track_cache_ids))
141
if(count($track_cache_ids))
142
142
{
143
143
// Is the comments shared or liked by me?
144
144
$sql = 'SELECT item_id, track_type
@@ -611,6 +611,7 @@
611
611
'about_me' => '',
612
612
'header_image' => '',
613
613
'header_image_id' => 0,
614
'public_profile' => 1,
614
615
];
615
616
616
617
if(!is_array($user_ids))
@@ -652,23 +653,27 @@
652
653
*/
653
654
public function save_user_extra_data($user_id, $data)
654
655
{
655
$current_data = $this->get_user_extra_data($user_id);
656
$current_data = array_merge($current_data, $data);
657
$current_data = serialize($current_data);
656
$current_data = array_merge(
657
$this->get_user_extra_data($user_id),
658
$data
659
);
660
661
$sql_ary = [
662
'item_data' => serialize($current_data)
663
];
658
664
659
665
// First, try to update
660
$sql = 'UPDATE ' . $this->tables['data'] . "
661
SET item_data = '" . $current_data . "'
662
WHERE user_id = " . $user_id . '
666
$sql = 'UPDATE ' . $this->tables['data'] . '
667
SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . '
668
WHERE user_id = ' . $user_id . '
663
669
AND item_type = ' . constants::ITEM_USER_EXTRA;
664
670
$this->db->sql_query($sql);
665
671
666
672
// If no current row, insert one
667
673
if(!$this->db->sql_affectedrows())
668
674
{
669
$sql_ary = [
675
$sql_ary += [
670
676
'user_id' => $user_id,
671
'item_data' => $current_data,
672
677
'item_type' => constants::ITEM_USER_EXTRA,
673
678
];
674
679
migrations/v206.php
@@ -0,0 +1,47 @@
1
<?php
2
/**
3
* @package cBB Follower
4
* @version 2.0.6 24/02/2025
5
*
6
* @copyright (c) 2025 CaniDev
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
*/
9
10
namespace canidev\follower\migrations;
11
12
class v206 extends \phpbb\db\migration\container_aware_migration
13
{
14
/**
15
* {@inheritDoc}
16
*/
17
public function effectively_installed()
18
{
19
/** @var \phpbb\db\migration\tool\permission */
20
$permission = $this->container->get('migrator.tool.permission');
21
22
return $permission->exists('m_fwr_view_private');
23
}
24
25
/**
26
* {@inheritDoc}
27
*/
28
static public function depends_on()
29
{
30
return [
31
'\canidev\follower\migrations\v205',
32
];
33
}
34
35
/**
36
* {@inheritDoc}
37
*/
38
public function update_data()
39
{
40
return [
41
// Define permissions to add and set
42
['permission.add', ['m_fwr_view_private', true]],
43
44
['permission.permission_set', ['GLOBAL_MODERATORS', 'm_fwr_view_private', 'group']],
45
];
46
}
47
}
notification/base.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
@@ -13,10 +13,13 @@
13
13
14
14
abstract class base extends \phpbb\notification\type\base
15
15
{
16
protected $notifications_table;
16
/** @var \phpbb\routing\helper */
17
17
protected $routing_helper;
18
19
/** @var \phpbb\user_loader */
18
20
protected $user_loader;
19
21
22
protected $notifications_table;
20
23
protected $tables;
21
24
22
25
/**
@@ -127,20 +130,20 @@
127
130
$usernames[] = $this->user_loader->get_username($user_id, 'no_profile');
128
131
}
129
132
130
if(!sizeof($user_ids))
133
$users_cnt = count($user_ids);
134
135
if(!$users_cnt)
131
136
{
132
137
$user_ids[] = ANONYMOUS;
133
138
$usernames[] = $this->language->lang('SOMEBODY');
134
139
}
135
140
136
$users_cnt = sizeof($user_ids);
137
138
141
// Always show the last users
139
142
$user_ids = array_reverse($user_ids);
140
143
141
144
// Reduze number of users
142
145
$user_ids = $this->trim_user_ary($user_ids);
143
$trimmed_cnt = $users_cnt - sizeof($user_ids);
146
$trimmed_cnt = $users_cnt - count($user_ids);
144
147
145
148
if($trimmed_cnt > 20)
146
149
{
notification/birthday.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/comment.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/follow.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/like.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/mention.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/post.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/reply.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/share.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
notification/topic.php
@@ -1,9 +1,9 @@
1
1
<?php
2
2
/**
3
3
* @package cBB Follower
4
* @version 2.0.5 21/10/2024
4
* @version 2.0.6 24/02/2025
5
5
*
6
* @copyright (c) 2024 CaniDev
6
* @copyright (c) 2025 CaniDev
7
7
* @license https://creativecommons.org/licenses/by-nc/4.0/
8
8
*/
9
9
styles/all/template/event/ucp_profile_profile_info_before.html
@@ -1,5 +1,12 @@
1
1
2
2
<dl>
3
<dt><label for="public_profile1">{{ lang('PUBLIC_PROFILE') ~ lang('COLON') }}</label><br /><span>{{ lang('PUBLIC_PROFILE_EXPLAIN') }}</span></dt>
4
<dd>
5
<label for="public_profile1"><input type="radio" name="public_profile" id="public_profile1" value="1"{{ S_PUBLIC_PROFILE ? ' checked="checked"' : '' }} /> {{ lang('YES') }}</label>
6
<label for="public_profile0"><input type="radio" name="public_profile" id="public_profile0" value="0"{{ not S_PUBLIC_PROFILE ? ' checked="checked"' : '' }} /> {{ lang('NO') }}</label>
7
</dd>
8
</dl>
9
<dl>
3
10
<dt><label for="aboutme">{{ lang('ABOUTME') ~ lang('COLON') }}</label><br /><span>{{ lang('ABOUTME_EXPLAIN') }}</span></dt>
4
11
<dd><textarea name="aboutme" id="aboutme" class="inputbox" rows="3" cols="30">{{ S_ABOUTME }}</textarea></dd>
5
12
</dl>
styles/all/template/follower_body.html
@@ -22,11 +22,13 @@
22
22
{{ S_FOLLOW_BUTTON }}
23
23
</div>
24
24
<div class="fw-card-text">{{ S_USER_DESCRIPTION }}</div>
25
26
{% EVENT follower_user_info_box %}
25
27
26
28
<ul class="fw-card-stats">
27
<li>{{ lang('POSTS') }} <span>{{ S_USER_POSTS }}</span></li>
28
<li>{{ lang('COMMENTS') }} <span>{{ S_USER_COMMENTS }}</span></li>
29
<li>{{ lang('FOLLOWERS') }} <span>{{ S_USER_FOLLOWERS }}</span></li>
29
{% for counter in user_counters %}
30
<li>{{ counter.LABEL }}<span>{{ counter.VALUE }}</span></li>
31
{% endfor %}
30
32
</ul>
31
33
</div>
32
34
{% else %}
styles/all/template/wall_row.html
@@ -49,7 +49,7 @@
49
49
{% endif %}
50
50
51
51
{% if wallrow.S_FIRST_ROW %}
52
<div class="fw-replies-separator{% if wallrow.S_LAST_ROW %} cbb-helper-hidden{% endif %}"><br /><span class="fwsmall-text">{{ lang('WALL_REPLIES') }}</span><hr /></div>
52
<div class="fw-replies-separator{% if wallrow.S_LAST_ROW %} cbb-helper-hidden{% endif %}"><span class="fwsmall-text">{{ lang('WALL_REPLIES') }}</span></div>
53
53
{% endif %}
54
54
{% else %}
55
55
<div class="wall-row" {{ wallrow.S_ATTR }}>
styles/all/theme/follower.css
@@ -1,7 +1,7 @@
1
1
/* cBB Follower StyleSheet
2
2
--------------------------------------------------------------
3
3
Style: All
4
Copyright (c) 2023 CaniDev ( https://www.canidev.com )
4
Copyright (c) 2025 CaniDev ( https://www.canidev.com )
5
5
--------------------------------------------------------------
6
6
*/
7
7
@@ -13,10 +12,11 @@
13
12
14
13
/* Wall and Dialog
15
14
----------------------------- */
16
#wall-content {
15
body {
17
16
--wall-background-color: #fff;
18
17
--wall-border-color: #e1e8ed;
19
18
}
19
#wall-content {
20
20
color: #000;
21
21
font-size: 1.1em;
22
22
margin: 10px 0;
@@ -91,7 +91,7 @@
91
91
text-transform: uppercase;
92
92
padding: 10px 15px 7px;
93
93
text-decoration: none;
94
vertical-align: middle;
94
vertical-align: bottom;
95
95
}
96
96
97
97
#wall-tabs a.tab.active {
@@ -166,6 +166,10 @@
166
166
width: auto;
167
167
}
168
168
169
.wall-right-side dl {
170
font-size: 1em;
171
}
172
169
173
.wall-right-side dt {
170
174
width: 40%;
171
175
}
@@ -418,6 +422,13 @@
418
422
padding-top: 0;
419
423
}
420
424
425
.fw-replies-separator {
426
border-bottom: 1px solid var(--wall-border-color);
427
padding-bottom: 5px;
428
margin-bottom: 15px;
429
margin-top: 20px;
430
}
431
421
432
.avatar-inline {
422
433
display: inline-block;
423
434
float: none;
@@ -544,8 +555,9 @@
544
555
.fw-comment-box textarea,
545
556
.fw-comment-box .fw-editor {
546
557
border: 1px solid #ccc;
547
height: 2.2em;
558
height: 2.5em;
548
559
outline: none;
560
scrollbar-width: thin;
549
561
width: 100%;
550
562
}
551
563
@@ -567,49 +579,52 @@
567
579
568
580
.fw-editor {
569
581
overflow: hidden;
570
padding: 5px 30px 5px 5px;
582
padding: 5px 40px 5px 5px;
571
583
}
572
584
573
585
.fw-editor-smilies {
574
586
position: absolute;
575
right: 8px;
587
right: 13px;
576
588
top: 6px;
577
589
font-size: 1.5em;
578
590
}
579
591
580
592
.fw-editor-counter {
581
top: 40px;
593
align-items: center;
594
gap: 2px;
582
595
position: absolute;
583
right: 5px;
596
right: 12px;
597
top: 40px;
584
598
}
585
599
586
600
.fw-editor-counter > svg {
587
margin-bottom: -4px;
588
601
overflow: visible;
589
602
transform: rotate(-90deg);
590
603
}
591
604
592
605
.fw-editor-counter > span {
593
606
color: #e0245e;
594
margin: 4px 2px 0 0;
595
display: inline-block;
596
vertical-align: top;
607
font-size: 0.8em;
597
608
}
598
609
599
610
.fw-editor-smilies,
600
611
.fw-editor-counter {
601
612
display: none;
613
line-height: 1.2em;
602
614
}
603
615
604
616
.fw-comment-box.active .fw-editor {
605
617
overflow: auto;
606
618
}
607
619
608
.fw-comment-box.active .fw-editor-smilies,
609
.fw-comment-box.active .fw-editor-counter {
620
.fw-comment-box.active .fw-editor-smilies {
610
621
display: block;
611
622
}
612
623
624
.fw-comment-box.active .fw-editor-counter {
625
display: flex;
626
}
627
613
628
.fw-editor-counter .safe {
614
629
stroke: #1da1f2;
615
630
}
@@ -653,13 +668,14 @@
653
668
content: attr(placeholder);
654
669
cursor: text;
655
670
display: block;
671
line-height: 1.5em;
656
672
opacity: 0.7;
657
673
}
658
674
659
675
/* User card
660
676
------------------------------ */
661
677
.fw-user-card {
662
font-size: 11px;
678
font-size: 12px;
663
679
width: 250px;
664
680
}
665
681
@@ -689,7 +705,7 @@
689
705
}
690
706
691
707
.fw-user-card .screen-name {
692
font-size: 1.2em;
708
font-size: 1.1em;
693
709
font-weight: bold;
694
710
}
695
711
@@ -713,6 +729,7 @@
713
729
}
714
730
715
731
.fw-card-stats {
732
font-size: 0.95em;
716
733
list-style-type: none;
717
734
margin: 10px 0;
718
735
padding: 0;
@@ -829,17 +846,17 @@
829
846
}
830
847
831
848
.rtl .fw-editor {
832
padding-left: 30px;
849
padding-left: 40px;
833
850
padding-right: 5px;
834
851
}
835
852
836
853
.rtl .fw-editor-smilies {
837
left: 8px;
854
left: 14px;
838
855
right: unset;
839
856
}
840
857
841
858
.rtl .fw-editor-counter {
842
left: 5px;
859
left: 12px;
843
860
right: unset;
844
861
}
845
862
@@ -875,7 +892,8 @@
875
892
}
876
893
877
894
.dark-theme .fw-comment-box textarea,
878
.dark-theme .fw-comment-box .fw-editor {
895
.dark-theme .fw-comment-box .fw-editor,
896
.dark-theme .fw-replies-separator {
879
897
border-color: #444;
880
898
}
881
899