12
12
use SModders \TelegramCore \Entity \User ;
13
13
use TelegramBot \Api \BotApi ;
14
14
use TelegramBot \Api \Client ;
15
- use XF \ConnectedAccount \Provider \AbstractProvider ;
16
15
use XF \Container ;
17
16
use XF \SubContainer \AbstractSubContainer ;
18
17
@@ -150,20 +149,36 @@ public function isInstalled()
150
149
{
151
150
return $ this ->container ['bot.isInstalled ' ];
152
151
}
153
-
154
- public function asTelegramVisitorById ($ userId , \Closure $ action , $ setLanguage = true )
152
+
153
+ /**
154
+ * @param $userId
155
+ * @param \Closure $action
156
+ * @param bool $setLanguage
157
+ * @param bool $setStyle
158
+ * @return mixed
159
+ * @throws \Exception
160
+ */
161
+ public function asTelegramVisitorById ($ userId , \Closure $ action , $ setLanguage = true , $ setStyle = true )
155
162
{
156
163
/** @var \SModders\TelegramCore\Entity\User|null $user */
157
164
$ user = \XF ::em ()->find ('SModders \\TelegramCore:User ' , $ userId );
158
165
if (!$ user )
159
166
{
160
- return $ action (false );
167
+ return $ action (false , false );
161
168
}
162
169
163
170
return $ this ->asTelegramVisitor ($ user , $ action , $ setLanguage );
164
171
}
165
-
166
- public function asTelegramVisitor (User $ user , \Closure $ action , $ setLanguage = true )
172
+
173
+ /**
174
+ * @param User $user
175
+ * @param \Closure $action
176
+ * @param bool $setLanguage
177
+ * @param bool $setStyle
178
+ * @return mixed
179
+ * @throws \Exception
180
+ */
181
+ public function asTelegramVisitor (User $ user , \Closure $ action , $ setLanguage = true , $ setStyle = true )
167
182
{
168
183
/** @var \XF\Entity\UserConnectedAccount|null $xfUserConnectedAccount */
169
184
$ xfUserConnectedAccount = \XF ::em ()->findOne ('XF:UserConnectedAccount ' , [
@@ -172,28 +187,93 @@ public function asTelegramVisitor(User $user, \Closure $action, $setLanguage = t
172
187
], 'User ' );
173
188
if (!$ xfUserConnectedAccount )
174
189
{
175
- return $ action (false );
190
+ return $ action (null );
176
191
}
177
192
178
193
$ xfUser = $ xfUserConnectedAccount ->User ;
179
-
180
- $ oldLanguage = \XF ::language ();
181
- if ($ setLanguage )
194
+
195
+ // Additional wrapper. We're want add user entity from argument start.
196
+ $ originalAction = $ action ;
197
+ $ action = function () use ($ originalAction , $ user )
182
198
{
183
- $ language = \XF ::app ()->language ($ xfUser ->language_id );
184
- \XF ::setLanguage ($ language );
185
- }
186
-
187
- try
199
+ $ arguments = [$ user ] + func_get_args ();
200
+
201
+ return call_user_func_array ($ originalAction , $ arguments );
202
+ };
203
+
204
+ // Finally - call the function chain.
205
+ return $ this ->asVisitor ($ xfUser , $ action , $ setLanguage , $ setStyle );
206
+ }
207
+
208
+ /**
209
+ * Temporarily take an action with the given user considered to be the visitor.
210
+ * Also changes the language.
211
+ *
212
+ * @param \XF\Entity\User $user
213
+ * @param \Closure $action
214
+ * @param boolean $setLanguage
215
+ * @param boolean $setStyle
216
+ * @return mixed
217
+ * @throws \Exception
218
+ */
219
+ public function asVisitor (\XF \Entity \User $ user , $ action , $ setLanguage = true , $ setStyle = true )
220
+ {
221
+ if ($ setLanguage )
188
222
{
189
- return \XF ::asVisitor ($ xfUser , $ action );
223
+ $ originalAction = $ action ;
224
+ $ action = function () use ($ originalAction , $ user )
225
+ {
226
+ $ app = \XF ::app ();
227
+ $ templater = $ app ->templater ();
228
+
229
+ $ newLanguage = $ app ->language ($ user ->language_id );
230
+ $ oldLanguage = \XF ::language ();
231
+ $ oldTemplaterLanguage = $ templater ->getLanguage ();
232
+
233
+ \XF ::setLanguage ($ newLanguage );
234
+ $ templater ->setLanguage ($ newLanguage );
235
+
236
+ try
237
+ {
238
+ return call_user_func_array ($ originalAction , func_get_args ());
239
+ }
240
+ finally
241
+ {
242
+ if ($ oldLanguage != null )
243
+ {
244
+ \XF ::setLanguage ($ oldLanguage );
245
+ $ templater ->setLanguage ($ oldTemplaterLanguage );
246
+ }
247
+ }
248
+ };
190
249
}
191
- finally
250
+ if ( $ setStyle )
192
251
{
193
- if ($ setLanguage )
252
+ $ originalAction = $ action ;
253
+ $ action = function () use ($ originalAction , $ user )
194
254
{
195
- \XF ::setLanguage ($ oldLanguage );
196
- }
255
+ $ app = \XF ::app ();
256
+ $ templater = $ app ->templater ();
257
+
258
+ $ newStyle = $ app ->style ($ user ->style_id );
259
+ $ oldStyle = $ templater ->getStyle ();
260
+
261
+ $ templater ->setStyle ($ newStyle );
262
+
263
+ try
264
+ {
265
+ return call_user_func_array ($ originalAction , func_get_args ());
266
+ }
267
+ finally
268
+ {
269
+ if ($ oldStyle != null )
270
+ {
271
+ $ templater ->setStyle ($ oldStyle );
272
+ }
273
+ }
274
+ };
197
275
}
276
+
277
+ return \XF ::asVisitor ($ user , $ action );
198
278
}
199
279
}
0 commit comments