if (!$token) {
$token = new TwitchToken();
$token->nick = $this->argument('nick');
- $token->scope = ['chat:read', 'chat:edit', 'whispers:read', 'whispers:edit'];
+ $token->scope = ['chat:read', 'chat:edit', 'whispers:read', 'user:manage:whispers'];
}
$url = $token->getAuthUrl();
$this->line('Please visit '.$url);
return TokenizedMessage::fromIRC($this);
}
+ public static function capReq($cap) {
+ $msg = new IRCMessage();
+ $msg->command = 'CAP REQ';
+ $msg->params[] = $cap;
+ return $msg;
+ }
+
public static function join($channels) {
$msg = new IRCMessage();
$msg->command = 'JOIN';
return $this->command == 'PRIVMSG';
}
+ public function isWhisper() {
+ return $this->command == 'WHISPER';
+ }
+
public function isOwner() {
return substr($this->getPrivMsgTarget(), 1) == $this->nick;
}
$this->handlePrivMsg($msg);
return;
}
+ if ($msg->isWhisper()) {
+ $this->handleWhisper($msg);
+ return;
+ }
if ($msg->isNotice() && $msg->getText() == 'Login authentication failed') {
$this->logger->notice('login failed, refreshing access token');
$this->token->refresh();
$this->ready = true;
return;
}
+ if ($msg->command == 'GLOBALUSERSTATE') {
+ // receive own user metadata
+ $this->handleUserState($msg);
+ return;
+ }
}
public function getMessageChannel(IRCMessage $msg) {
public function handlePrivMsg(IRCMessage $msg) {
}
+ public function handleUserState(IRCMessage $msg) {
+ if (isset($msg->tags['user-id'])) {
+ $this->user_id = $msg->tags['user-id'];
+ }
+ }
+
+ public function handleWhisper(IRCMessage $msg) {
+ }
+
public function login() {
$this->ws->send('PASS oauth:'.$this->token->access);
$this->ws->send('NICK '.$this->nick);
$this->last_contact = time();
}
+ public function sendWhisper($to, $msg) {
+ $this->logger->info('sending whisper to '.$to.': '.$msg);
+ try {
+ $response = $this->token->request()->post('/whispers?from_user_id='.$this->user_id.'&to_user_id='.$to, [
+ 'message' => $msg,
+ ]);
+ if (!$response->successful()) {
+ $this->logger->error('sending whisper to '.$to.': '.$response->status());
+ }
+ } catch (\Exception $e) {
+ $this->logger->error('sending whisper to '.$to.': '.$e->getMessage());
+ }
+ }
+
protected function listenCommands() {
$this->getLoop()->addPeriodicTimer(1, function () {
private $nick;
private $token;
+ private $user_id = '';
private $connector;
private $ws;
$this->tagChannelRead($channel, $msg);
}
+ public function handleWhisper(IRCMessage $msg) {
+ $text = $this->chatlib->generate($msg->getText());
+ $this->sendWhisper($msg->tags['user-id'], $text);
+ }
+
public function getChatlibDatabase(Channel $channel) {
return $this->chatlib;
}