Compare commits

..

No commits in common. "2f5aa63306ed989499a2f2003d8cfcc36061d341" and "899b034013c89f13ecd5d2e444be2ab026326242" have entirely different histories.

4 changed files with 793 additions and 859 deletions

View File

@ -1,12 +1,8 @@
{ {
"com.thorlaksson.phpcs.formatOnSave" : true,
"com.thorlaksson.phpcs.runOnChange" : "onSave", "com.thorlaksson.phpcs.runOnChange" : "onSave",
"com.thorlaksson.phpcs.standard" : "phpcs.xml", "com.thorlaksson.phpcs.standard" : "phpcs.xml",
"editor.default_syntax" : "php", "editor.default_syntax" : "php",
"php.validate" : "onSave", "php.validate" : "onSave",
"prettier.format-on-save" : "Disable",
"prettier.format-on-save.ignore-remote" : "Disable",
"prettier.format-on-save.ignore-without-config" : "Disable",
"workspace.color" : 1, "workspace.color" : 1,
"workspace.name" : "APnutI" "workspace.name" : "APnutI"
} }

View File

@ -18,10 +18,10 @@
<property name="eolChar" value="\n"/> <property name="eolChar" value="\n"/>
</properties> </properties>
</rule> </rule>
<arg name="tab-width" value="4"/> <arg name="tab-width" value="2"/>
<rule ref="Generic.WhiteSpace.ScopeIndent"> <rule ref="Generic.WhiteSpace.ScopeIndent">
<properties> <properties>
<property name="indent" value="4"/> <property name="indent" value="2"/>
</properties> </properties>
</rule> </rule>

View File

@ -7,6 +7,7 @@ use APnutI\Entities\Poll;
use APnutI\Entities\User; use APnutI\Entities\User;
use APnutI\Entities\Channel; use APnutI\Entities\Channel;
use APnutI\Exceptions\PnutException; use APnutI\Exceptions\PnutException;
use APnutI\Exceptions\NotFoundException;
use APnutI\Exceptions\NotAuthorizedException; use APnutI\Exceptions\NotAuthorizedException;
use APnutI\Exceptions\HttpPnutException; use APnutI\Exceptions\HttpPnutException;
use APnutI\Exceptions\HttpPnutRedirectException; use APnutI\Exceptions\HttpPnutRedirectException;
@ -25,7 +26,7 @@ class APnutI
protected string $auth_url = 'https://pnut.io/oauth/authenticate'; protected string $auth_url = 'https://pnut.io/oauth/authenticate';
protected string $client_secret; protected string $client_secret;
protected string $client_id; protected string $client_id;
protected string $scope = ''; protected string $scope = "";
protected string $redirect_uri; protected string $redirect_uri;
protected int $rate_limit = 40; protected int $rate_limit = 40;
protected int $rate_limit_remaining = 40; protected int $rate_limit_remaining = 40;
@ -83,13 +84,12 @@ class APnutI
if (empty($log_level)) { if (empty($log_level)) {
$log_level = Logger::INFO; $log_level = Logger::INFO;
} elseif (is_string($log_level)) { } elseif (is_string($log_level)) {
$log_level = constant('Monolog\Logger::' . $log_level); $log_level = constant('Monolog\Logger::'.$log_level);
} }
$this->logger = empty($log_path) $this->logger = empty($log_path) ? new NullLogger() : new Logger($this->app_name);
? new NullLogger() $this->token_session_key = $this->app_name.'access_token';
: new Logger($this->app_name); $this->token_redirect_after_auth = $this->app_name
$this->token_session_key = $this->app_name . 'access_token'; .'redirect_after_auth';
$this->token_redirect_after_auth = $this->app_name . 'redirect_after_auth';
$handler = new RotatingFileHandler($log_path, 5, $log_level, true); $handler = new RotatingFileHandler($log_path, 5, $log_level, true);
$this->logger->pushHandler($handler); $this->logger->pushHandler($handler);
$this->server_token = null; $this->server_token = null;
@ -151,16 +151,16 @@ class APnutI
if (count($header) < 2) { if (count($header) < 2) {
continue; continue;
} }
list($k, $v) = $header; list($k,$v) = $header;
switch ($k) { switch ($k) {
case 'X-RateLimit-Remaining': case 'X-RateLimit-Remaining':
$this->rate_limit_remaining = (int) $v; $this->rate_limit_remaining = (int)$v;
break; break;
case 'X-RateLimit-Limit': case 'X-RateLimit-Limit':
$this->rate_limit = (int) $v; $this->rate_limit = (int)$v;
break; break;
case 'X-RateLimit-Reset': case 'X-RateLimit-Reset':
$this->rate_limit_reset = (int) $v; $this->rate_limit_reset = (int)$v;
break; break;
case 'X-OAuth-Scopes': case 'X-OAuth-Scopes':
$this->scope = $v; $this->scope = $v;
@ -169,9 +169,11 @@ class APnutI
case 'location': case 'location':
case 'Location': case 'Location':
$this->logger->debug( $this->logger->debug(
'Is redirect. Headers: ' . json_encode($this->headers) 'Is redirect. Headers: '.json_encode($this->headers)
);
$this->logger->debug(
'Is redirect. Target: '. $v
); );
$this->logger->debug('Is redirect. Target: ' . $v);
$this->redirect_target = $v; $this->redirect_target = $v;
break; break;
} }
@ -186,10 +188,11 @@ class APnutI
string $content_type = 'application/x-www-form-urlencoded', string $content_type = 'application/x-www-form-urlencoded',
bool $follow_redirect = true bool $follow_redirect = true
): array { ): array {
$this->redirect_target = null; $this->redirect_target = null;
$this->meta = null; $this->meta = null;
$method = strtoupper($method); $method = strtoupper($method);
$url = $this->api_url . $end_point; $url = $this->api_url.$end_point;
$this->logger->info("{$method} Request to {$url}"); $this->logger->info("{$method} Request to {$url}");
$ch = curl_init($url); $ch = curl_init($url);
$headers = []; $headers = [];
@ -198,29 +201,26 @@ class APnutI
// if they passed an array, build a list of parameters from it // if they passed an array, build a list of parameters from it
curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POST, true);
if (is_array($parameters) && $method !== 'POST-RAW') { if (is_array($parameters) && $method !== 'POST-RAW') {
$parameters = $parameters = $content_type === 'application/json' ? json_encode($parameters) : http_build_query($parameters);
$content_type === 'application/json'
? json_encode($parameters)
: http_build_query($parameters);
} }
curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters); curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
$headers[] = 'Content-Type: ' . $content_type; $headers[] = "Content-Type: ".$content_type;
} }
if ($method !== 'POST' && $method !== 'POST-RAW') { if ($method !== 'POST' && $method !== 'POST-RAW') {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
} }
if ($method === 'GET' && isset($parameters['access_token'])) { if ($method === 'GET' && isset($parameters['access_token'])) {
$this->logger->info('Using provided token for auth'); $this->logger->info("Using provided token for auth");
$headers[] = 'Authorization: Bearer ' . $parameters['access_token']; $headers[] = 'Authorization: Bearer '.$params['access_token'];
} elseif (!empty($this->access_token)) { } elseif (!empty($this->access_token)) {
$this->logger->info('Using access token for auth'); $this->logger->info("Using access token for auth");
$headers[] = 'Authorization: Bearer ' . $this->access_token; $headers[] = 'Authorization: Bearer '.$this->access_token;
} elseif (!empty($this->server_token)) { } elseif (!empty($this->server_token)) {
$use_server_token = true; $use_server_token = true;
$this->logger->info('Using server token for auth'); $this->logger->info("Using server token for auth");
$headers[] = 'Authorization: Bearer ' . $this->server_token; $headers[] = 'Authorization: Bearer '.$this->server_token;
} else { } else {
$this->logger->info('Using no auth'); $this->logger->info("Using no auth");
} }
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
@ -231,18 +231,15 @@ class APnutI
$response = curl_exec($ch); $response = curl_exec($ch);
$request = curl_getinfo($ch, CURLINFO_HEADER_OUT); $request = curl_getinfo($ch, CURLINFO_HEADER_OUT);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$effectiveURL = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close($ch); curl_close($ch);
$this->logger->debug( $this->logger->debug("{$method} Request to {$url}. Received status: {$http_status}. Response: {$response}");
"{$method} Request to {$url}. Received status: {$http_status}. Response: {$response}"
);
if ($http_status === 0) { if ($http_status === 0) {
throw new \Exception('Unable to connect to Pnut ' . $url); throw new \Exception('Unable to connect to Pnut ' . $url);
} }
if ($request === false) { if ($request === false) {
if (!curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT)) { if (!curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT)) {
throw new \Exception( throw new \Exception('SSL verification failed, connection terminated: ' . $url);
'SSL verification failed, connection terminated: ' . $url
);
} }
} }
if (!empty($response)) { if (!empty($response)) {
@ -284,24 +281,18 @@ class APnutI
// look for errors // look for errors
if (isset($response['error'])) { if (isset($response['error'])) {
if (is_array($response['error'])) { if (is_array($response['error'])) {
throw new PnutException( throw new PnutException($response['error']['message'], $response['error']['code']);
$response['error']['message'],
$response['error']['code']
);
} else { } else {
throw new PnutException($response['error']); throw new PnutException($response['error']);
} }
// look for response migration errors // look for response migration errors
} elseif (isset($response['meta'], $response['meta']['error_message'])) { } elseif (isset($response['meta'], $response['meta']['error_message'])) {
throw new PnutException( throw new PnutException($response['meta']['error_message'], $response['meta']['code']);
$response['meta']['error_message'],
$response['meta']['code']
);
} }
} }
} }
if ($http_status < 200 || $http_status >= 300) { if ($http_status < 200 || $http_status >= 300) {
throw new HttpPnutException('HTTP error ' . $http_status); throw new HttpPnutException('HTTP error '.$http_status);
} elseif (isset($response['meta'], $response['data'])) { } elseif (isset($response['meta'], $response['data'])) {
return $response['data']; return $response['data'];
} elseif (isset($response['access_token'])) { } elseif (isset($response['access_token'])) {
@ -309,11 +300,7 @@ class APnutI
} elseif (!empty($this->redirect_target)) { } elseif (!empty($this->redirect_target)) {
return [$this->redirect_target]; return [$this->redirect_target];
} else { } else {
throw new PnutException( throw new PnutException("No response ".json_encode($response).", http status: ${http_status}");
'No response ' .
json_encode($response) .
", http status: {$http_status}"
);
} }
} }
@ -326,8 +313,10 @@ class APnutI
return $this->makeRequest($method, $end_point, $parameters, $content_type); return $this->makeRequest($method, $end_point, $parameters, $content_type);
} }
public function postJson(string $end_point, array $parameters): array public function postJson(
{ string $end_point,
array $parameters
): array {
return $this->post($end_point, $parameters, 'application/json'); return $this->post($end_point, $parameters, 'application/json');
} }
@ -343,50 +332,35 @@ class APnutI
$end_point .= $separator . http_build_query($parameters); $end_point .= $separator . http_build_query($parameters);
$parameters = []; $parameters = [];
} }
return $this->makeRequest( return $this->makeRequest('get', $end_point, $parameters, $content_type, $follow_redirect);
'get',
$end_point,
$parameters,
$content_type,
$follow_redirect
);
} }
public function getAuthURL($append_redirect_query_string = null) public function getAuthURL()
{ {
$redirect_uri = $this->redirect_uri; $url = $this->auth_url
if (!empty($append_redirect_query_string)) { . '?client_id='
$redirect_uri .= $append_redirect_query_string; . $this->client_id
} . '&redirect_uri='
$url = . urlencode($this->redirect_uri)
$this->auth_url . . '&scope='.$this->needed_scope
'?client_id=' . . '&response_type=code';
$this->client_id .
'&redirect_uri=' .
urlencode($redirect_uri) .
'&scope=' .
$this->needed_scope .
'&response_type=code';
$this->logger->debug('Auth URL: ' . $url); $this->logger->debug('Auth URL: ' . $url);
return $url; return $url;
} }
//TODO: Ping server and validate token //TODO: Ping server and validate token
public function isAuthenticated( public function isAuthenticated(bool $allow_server_token = false, bool $skip_verify_token = false): bool
bool $allow_server_token = false, {
bool $skip_verify_token = false $is_authenticated = ($allow_server_token && !empty($this->server_token))
): bool { || isset($this->access_token);
$is_authenticated = $log_str = $is_authenticated
($allow_server_token && !empty($this->server_token)) || ? 'Authenticated'
isset($this->access_token); : 'Not authenticated';
$log_str = $is_authenticated ? 'Authenticated' : 'Not authenticated';
$this->logger->info( $this->logger->info(
"Checking auth status for app: {$this->app_name}: {$log_str}" "Checking auth status for app: {$this->app_name}: {$log_str}"
); );
if (isset($_SERVER['HTTP_REFERER'])) { if (isset($_SERVER['HTTP_REFERER'])) {
$this->logger->info( $this->logger->info('Referrer: '.($_SERVER['HTTP_REFERER'] ?? 'Unknown'));
'Referrer: ' . ($_SERVER['HTTP_REFERER'] ?? 'Unknown')
);
$_SESSION[$this->token_redirect_after_auth] = $_SERVER['HTTP_REFERER']; $_SESSION[$this->token_redirect_after_auth] = $_SERVER['HTTP_REFERER'];
} }
return $is_authenticated; return $is_authenticated;
@ -400,7 +374,7 @@ class APnutI
'client_secret' => $this->client_secret, 'client_secret' => $this->client_secret,
'code' => $auth_code, 'code' => $auth_code,
'redirect_uri' => $this->redirect_uri, 'redirect_uri' => $this->redirect_uri,
'grant_type' => 'authorization_code', 'grant_type'=> 'authorization_code'
]; ];
$resp = $this->post( $resp = $this->post(
'/oauth/access_token', '/oauth/access_token',
@ -409,7 +383,7 @@ class APnutI
); );
if (empty($resp['access_token'])) { if (empty($resp['access_token'])) {
$this->logger->error('No access token ' . json_encode($resp)); $this->logger->error("No access token ".json_encode($resp));
return false; return false;
} else { } else {
$this->logger->debug('Received access token ' . $resp['access_token']); $this->logger->debug('Received access token ' . $resp['access_token']);
@ -441,7 +415,7 @@ class APnutI
} }
*/ */
if (mb_substr($username, 0, 1) !== '@') { if (mb_substr($username, 0, 1) !== '@') {
$username = '@' . $username; $username = '@'.$username;
} }
$params = []; $params = [];
if ($count > 0) { if ($count > 0) {
@ -480,7 +454,9 @@ class APnutI
foreach ($posts as $post) { foreach ($posts as $post) {
$post_obj[] = new Post($post, $this); $post_obj[] = new Post($post, $this);
} }
} while ($this->meta != null && $this->meta->more && (count($post_obj) < $count || $count !== 0)); } while ($this->meta != null
&& $this->meta->more
&& (count($post_obj) < $count || $count !== 0));
return $post_obj; return $post_obj;
} }
@ -496,7 +472,7 @@ class APnutI
'include_html' => false, 'include_html' => false,
'include_mention_posts' => false, 'include_mention_posts' => false,
'include_copy_mentions' => false, 'include_copy_mentions' => false,
'include_post_raw' => true, 'include_post_raw' => true
]; ];
foreach ($params as $param => $value) { foreach ($params as $param => $value) {
$parameters[$param] = $value; $parameters[$param] = $value;
@ -524,7 +500,7 @@ class APnutI
$res = $this->get($endpoint, $args); $res = $this->get($endpoint, $args);
return new Poll($res, $this); return new Poll($res, $this);
} catch (NotSupportedPollException $e) { } catch (NotSupportedPollException $e) {
$this->logger->error('Poll not supported: ' . json_encode($res)); $this->logger->error('Poll not supported: '.json_encode($res));
throw $e; throw $e;
} catch (HttpPnutForbiddenException $fe) { } catch (HttpPnutForbiddenException $fe) {
$this->logger->error('Poll token required and not provided!'); $this->logger->error('Poll token required and not provided!');
@ -535,10 +511,8 @@ class APnutI
} }
} }
public function getPollFromToken( public function getPollFromToken(int $poll_id, ?string $poll_token = null): Poll
int $poll_id, {
?string $poll_token = null
): Poll {
$poll_token_query = empty($poll_token) ? '' : '?poll_token=' . $poll_token; $poll_token_query = empty($poll_token) ? '' : '?poll_token=' . $poll_token;
return $this->getPollFromEndpoint('/polls/' . $poll_id . $poll_token_query); return $this->getPollFromEndpoint('/polls/' . $poll_id . $poll_token_query);
} }
@ -550,19 +524,18 @@ class APnutI
} }
$this->logger->debug('Poll token provided'); $this->logger->debug('Poll token provided');
$re = $re = '/((http(s)?:\/\/)?((posts)|(beta))\.pnut\.io\/(@.*\/)?)?(?(1)|^)(?<postid>\d+)/';
'/((http(s)?:\/\/)?((posts)|(beta))\.pnut\.io\/(@.*\/)?)?(?(1)|^)(?<postid>\d+)/$';
preg_match($re, $poll_token, $matches); preg_match($re, $poll_token, $matches);
if (!empty($matches['postid'])) { if (!empty($matches['postid'])) {
$this->logger->debug('Poll token is post ' . $matches['postid']); $this->logger->debug('Poll token is post ' . $matches['postid']);
$post_id = (int) $matches['postid']; $post_id = (int)$matches['postid'];
$args = [ $args = [
'include_raw' => true, 'include_raw' => true,
'include_counts' => false, 'include_counts' => false,
'include_html' => false, 'include_html' => false,
'include_post_raw' => true, 'include_post_raw' => true
]; ];
return $this->getPollFromEndpoint('/posts/' . $post_id, $args); return $this->getPollFromEndpoint('/posts/' . $post_id, $arg);
} else { } else {
$this->logger->debug('Poll token seems to be an actual poll token'); $this->logger->debug('Poll token seems to be an actual poll token');
return $this->getPollFromToken($poll_id, $poll_token); return $this->getPollFromToken($poll_id, $poll_token);
@ -580,16 +553,13 @@ class APnutI
$poll_types = Poll::$poll_types; $poll_types = Poll::$poll_types;
$poll_types[] = Poll::$notice_type; $poll_types[] = Poll::$notice_type;
$poll_types_param = implode(',', $poll_types); $poll_types_param = implode(',', $poll_types);
$this->logger->info( $this->logger->info('No list of polls provided, using post search for poll types: '.$poll_types_param);
'No list of polls provided, using post search for poll types: ' . $endpoint = '/posts/search?raw_types='.$poll_types_param;
$poll_types_param
);
$endpoint = '/posts/search?raw_types=' . $poll_types_param;
$params = [ $params = [
'include_raw' => true, 'include_raw' => true,
'include_counts' => false, 'include_counts' => false,
'include_html' => false, 'include_html' => false,
'include_post_raw' => true, 'include_post_raw' => true
]; ];
} }
try { try {
@ -601,24 +571,21 @@ class APnutI
} }
return $polls; return $polls;
} catch (NotSupportedPollException $e) { } catch (NotSupportedPollException $e) {
$this->logger->error('Poll not supported: ' . json_encode($res)); $this->logger->error('Poll not supported: '.json_encode($res));
throw $e; throw $e;
} catch (HttpPnutForbiddenException) { } catch (HttpPnutForbiddenException $fe) {
$this->logger->error('Poll token required and not provided!'); $this->logger->error('Poll token required and not provided!');
throw new PollAccessRestrictedException(); throw new PollAccessRestrictedException();
} catch (NotAuthorizedException) { } catch (NotAuthorizedException $nauth) {
$this->logger->error('Not authorized when fetching poll'); $this->logger->error('Not authorized when fetching poll');
throw new PollAccessRestrictedException(); throw new PollAccessRestrictedException();
} }
} }
public function voteInPoll( public function voteInPoll(int $poll_id, array $options, ?string $poll_token): Poll
int $poll_id, {
array $options,
?string $poll_token
): Poll {
$params = [ $params = [
'positions' => $options, 'positions' => $options
]; ];
if (!empty($poll_token)) { if (!empty($poll_token)) {
$params['poll_token'] = $poll_token; $params['poll_token'] = $poll_token;
@ -642,7 +609,7 @@ class APnutI
public function getUser(int $user_id, array $args = []) public function getUser(int $user_id, array $args = [])
{ {
return new User($this->get('/users/' . $user_id, $args), $this); return new User($this->get('/users/'.$user_id, $args), $this);
} }
public function getPost(int $post_id, array $args = []) public function getPost(int $post_id, array $args = [])
@ -650,15 +617,15 @@ class APnutI
if (!empty($this->access_token)) { if (!empty($this->access_token)) {
#$this->logger->info("AT:".$this->access_token); #$this->logger->info("AT:".$this->access_token);
} else { } else {
$this->logger->info('No AT'); $this->logger->info("No AT");
} }
// Remove in production again // Remove in production again
try { try {
$p = new Post($this->get('/posts/' . $post_id, $args), $this); $p = new Post($this->get('/posts/'.$post_id, $args), $this);
$this->logger->debug(json_encode($p)); $this->logger->debug(json_encode($p));
return $p; return $p;
} catch (NotAuthorizedException) { } catch (NotAuthorizedException $nae) {
$this->logger->warning( $this->logger->warning(
'NotAuthorizedException when getting post, trying without access token' 'NotAuthorizedException when getting post, trying without access token'
); );
@ -679,18 +646,11 @@ class APnutI
//get returns an array with the url at idx 0 //get returns an array with the url at idx 0
$r = null; $r = null;
try { try {
$r = $this->get( $r = $this->get('/users/'.$user_id.'/avatar', $args, 'application/json', false);
'/users/' . $user_id . '/avatar',
$args,
'application/json',
false
);
} catch (HttpPnutRedirectException $re) { } catch (HttpPnutRedirectException $re) {
return $re->response; return $re->response;
} }
$this->logger->error( $this->logger->error('Could not fetch avatar: No redirection! ' . json_encode($r));
'Could not fetch avatar: No redirection! ' . json_encode($r)
);
throw new PnutException('Could not fetch avatar: No redirection!'); throw new PnutException('Could not fetch avatar: No redirection!');
} }
@ -745,7 +705,7 @@ class APnutI
bool $auto_crop = false, bool $auto_crop = false,
array $raw = [] array $raw = []
): Post { ): Post {
return $this->createPost($text, $reply_to, $is_nsfw, $auto_crop, $raw); return createPost($text, $reply_to, $is_nsfw, $auto_crop, $raw);
} }
public function createPost( public function createPost(
@ -764,10 +724,7 @@ class APnutI
if (!empty($raw)) { if (!empty($raw)) {
$parameters['raw'] = $parameters; $parameters['raw'] = $parameters;
} }
return new Post( return new Post($this->post('/posts', $parameters, 'application/json'), $this);
$this->post('/posts', $parameters, 'application/json'),
$this
);
} }
public function createPostWithParameters( public function createPostWithParameters(
@ -782,28 +739,20 @@ class APnutI
$parameters = array_merge($parameters, $params); $parameters = array_merge($parameters, $params);
$this->logger->debug('Post with params'); $this->logger->debug('Post with params');
$this->logger->debug(json_encode($parameters)); $this->logger->debug(json_encode($parameters));
return new Post( return new Post($this->post('/posts', $parameters, 'application/json'), $this);
$this->post('/posts', $parameters, 'application/json'),
$this
);
} }
public function getChannel(int $channel_id): Channel public function getChannel(int $channel_id): Channel
{ {
# Always include channel raw, it contains the channel name # Always include channel raw, it contains the channel name
$parameters = [ $parameters = [
'include_channel_raw' => true, 'include_channel_raw' => true
]; ];
return new Channel( return new Channel($this->get('/channels/'.$channel_id, $parameters), $this);
$this->get('/channels/' . $channel_id, $parameters),
$this
);
} }
public function getSubscribedChannels( public function getSubscribedChannels(bool $include_pms = true, bool $include_channels = true): array
bool $include_pms = true, {
bool $include_channels = true
): array {
# Always include channel raw, it contains the channel name # Always include channel raw, it contains the channel name
$channel_types = []; $channel_types = [];
if ($include_pms) { if ($include_pms) {
@ -815,7 +764,7 @@ class APnutI
$parameters = [ $parameters = [
'include_channel_raw' => true, 'include_channel_raw' => true,
'channel_types' => implode(',', $channel_types), 'channel_types' => implode(',', $channel_types)
]; ];
$channels = []; $channels = [];
$resp = $this->get('/users/me/channels/subscribed', $parameters); $resp = $this->get('/users/me/channels/subscribed', $parameters);
@ -831,28 +780,19 @@ class APnutI
self::$POST_MAX_LENGTH = $config['post']['max_length']; self::$POST_MAX_LENGTH = $config['post']['max_length'];
//self::$POST_MAX_LENGTH_REPOST = $config['post']['repost_max_length']; //self::$POST_MAX_LENGTH_REPOST = $config['post']['repost_max_length'];
self::$POST_MAX_LENGTH_REPOST = self::$POST_MAX_LENGTH; self::$POST_MAX_LENGTH_REPOST = self::$POST_MAX_LENGTH;
self::$POST_SECONDS_BETWEEN_DUPLICATES = self::$POST_SECONDS_BETWEEN_DUPLICATES = $config['post']['seconds_between_duplicates'];
$config['post']['seconds_between_duplicates'];
self::$MESSAGE_MAX_LENGTH = $config['message']['max_length']; self::$MESSAGE_MAX_LENGTH = $config['message']['max_length'];
self::$RAW_MAX_LENGTH = $config['raw']['max_length']; self::$RAW_MAX_LENGTH = $config['raw']['max_length'];
self::$USER_DESCRIPTION_MAX_LENGTH = self::$USER_DESCRIPTION_MAX_LENGTH = $config['user']['description_max_length'];
$config['user']['description_max_length'];
self::$USER_USERNAME_MAX_LENGTH = $config['user']['username_max_length']; self::$USER_USERNAME_MAX_LENGTH = $config['user']['username_max_length'];
$this->logger->info('-----------Pnut API config-----------'); $this->logger->info('-----------Pnut API config-----------');
$this->logger->info(''); $this->logger->info('');
$this->logger->info('Max post length: ' . self::$POST_MAX_LENGTH); $this->logger->info("Max post length: ".self::$POST_MAX_LENGTH);
$this->logger->info('Max repost length: ' . self::$POST_MAX_LENGTH_REPOST); $this->logger->info("Max repost length: ".self::$POST_MAX_LENGTH_REPOST);
$this->logger->info( $this->logger->info("Seconds between post duplicates: ".self::$POST_SECONDS_BETWEEN_DUPLICATES);
'Seconds between post duplicates: ' . $this->logger->info("Max raw length: ".self::$RAW_MAX_LENGTH);
self::$POST_SECONDS_BETWEEN_DUPLICATES $this->logger->info("Max user description length: ".self::$USER_DESCRIPTION_MAX_LENGTH);
); $this->logger->info("Max username length: ".self::$USER_USERNAME_MAX_LENGTH);
$this->logger->info('Max raw length: ' . self::$RAW_MAX_LENGTH);
$this->logger->info(
'Max user description length: ' . self::$USER_DESCRIPTION_MAX_LENGTH
);
$this->logger->info(
'Max username length: ' . self::$USER_USERNAME_MAX_LENGTH
);
$this->logger->info('--------------------------------------'); $this->logger->info('--------------------------------------');
} }
@ -868,7 +808,7 @@ class APnutI
{ {
$token = $this->getServerToken(); $token = $this->getServerToken();
$this->server_token = $token; $this->server_token = $token;
$this->logger->info('ST:' . $this->server_token); $this->logger->info("ST:".$this->server_token);
} }
protected function getServerToken(): string protected function getServerToken(): string
@ -877,16 +817,14 @@ class APnutI
$params = [ $params = [
'client_id' => $this->client_id, 'client_id' => $this->client_id,
'client_secret' => $this->client_secret, 'client_secret' => $this->client_secret,
'grant_type' => 'client_credentials', 'grant_type' => 'client_credentials'
]; ];
$resp = $this->post('/oauth/access_token', $params); $resp = $this->post('/oauth/access_token', $params);
if (!empty($resp['access_token'])) { if (!empty($resp['access_token'])) {
$this->logger->info(json_encode($resp)); $this->logger->info(json_encode($resp));
return $resp['access_token']; return $resp['access_token'];
} else { } else {
throw new PnutException( throw new PnutException("Error retrieving app access token: ".json_encode($resp));
'Error retrieving app access token: ' . json_encode($resp)
);
} }
} }