ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Настройка телеграм бота (https://forum.antichat.xyz/showthread.php?t=787016)

AmaTo 02.05.2023 20:14

Привет всем. Сделал бота розыграшей, все ок запускается работает, но если выигрывает человек с закрытым профилем, багается конкурс ссылаясь на null профиля человека. Можно ли как то запретить участвовать людям с закрытым профилем или вообще сделать запрет чтобы с закрытым профилем нельзя было вступить в группу?

Цитата:

Сообщение от Спойлер

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Column 'winner_username' cannot be null - тут то понятно что не может записать в бд

Exception in thread "OkHttp Dispatcher" java.lang.NullPointerException


Se1dhe 02.05.2023 20:20

Цитата:

Сообщение от AmaTo

Привет всем. Сделал бота розыграшей, все ок запускается работает, но если выигрывает человек с закрытым профилем, багается конкурс ссылаясь на null профиля человека. Можно ли как то запретить участвовать людям с закрытым профилем или вообще сделать запрет чтобы с закрытым профилем нельзя было вступить в группу?
Цитата:

Сообщение от Спойлер

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Column 'winner_username' cannot be null - тут то понятно что не может записать в бд

Exception in thread "OkHttp Dispatcher" java.lang.NullPointerException


Код сохранения в бд?

На каком этапе бот дергает юзера? Конкурс проводится в чате канала, или лично?

AmaTo 02.05.2023 20:21

Цитата:

Сообщение от Se1dhe

Код сохранения в бд?

Java:


Код:

private
void
saveWinner
(
GAWinner
winner
,
String
player
)
{
Connect
con
=
null
;
PreparedStatement
st
=
null
;
try
{
con
=
L2DatabaseFactory
.
get
(
)
;
st
=
con
.
prepareStatement
(
"REPLACE INTO ga_winners (ga_id,winner_display_name,winner_userId,winner_username,prize_received,place,received_to) VALUES (?,?,?,?,?,?,?)"
)
;
st
.
setInt
(
1
,
winner
.
GA_ID
)
;
st
.
setString
(
2
,
winner
.
displayName
)
;
st
.
setLong
(
3
,
winner
.
userId
)
;
st
.
setString
(
4
,
winner
.
username
)
;
st
.
setInt
(
5
,
winner
.
received
?
1
:
0
)
;
st
.
setInt
(
6
,
winner
.
place
)
;
st
.
setString
(
7
,
player
)
;
st
.
execute
(
)
;
}
catch
(
Exception
e
)
{
_log
.
warning
(
"could not save GA Winner:"
+
e
)
;
e
.
printStackTrace
(
)
;
}
finally
{
Close
.
CS
(
con
,
st
)
;
}
}

Зависает когда определяет победителя.

Проводится в группе

Se1dhe 02.05.2023 20:23

Цитата:

Сообщение от AmaTo

Java:


Код:

private
void
saveWinner
(
GAWinner
winner
,
String
player
)
{
Connect
con
=
null
;
PreparedStatement
st
=
null
;
try
{
con
=
L2DatabaseFactory
.
get
(
)
;
st
=
con
.
prepareStatement
(
"REPLACE INTO ga_winners (ga_id,winner_display_name,winner_userId,winner_username,prize_received,place,received_to) VALUES (?,?,?,?,?,?,?)"
)
;
st
.
setInt
(
1
,
winner
.
GA_ID
)
;
st
.
setString
(
2
,
winner
.
displayName
)
;
st
.
setLong
(
3
,
winner
.
userId
)
;
st
.
setString
(
4
,
winner
.
username
)
;
st
.
setInt
(
5
,
winner
.
received
?
1
:
0
)
;
st
.
setInt
(
6
,
winner
.
place
)
;
st
.
setString
(
7
,
player
)
;
st
.
execute
(
)
;
}
catch
(
Exception
e
)
{
_log
.
warning
(
"could not save GA Winner:"
+
e
)
;
e
.
printStackTrace
(
)
;
}
finally
{
Close
.
CS
(
con
,
st
)
;
}
}


Java:


Код:

public
void
onCommandMessage
(
AbstractTelegramBot
bot
,
Update
update
,
Message
message
,
List

list
)
throws
TelegramApiException
{
String
userName
=
message
.
getFrom
(
)
.
getFirstName
(
)
;
if
(
message
.
getFrom
(
)
.
getUserName
(
)
!=
null
)
{
userName
=
message
.
getFrom
(
)
.
getUserName
(
)
;
}
if
(
!
createdAdmin
.
get
(
)
&&
dbUserService
.
findAll
(
)
.
isEmpty
(
)
)
{
if
(
createdAdmin
.
compareAndSet
(
false
,
true
)
)
{
if
(
dbUserService
.
findById
(
message
.
getFrom
(
)
.
getId
(
)
)
==
null
)
{
dbUserService
.
create
(
message
.
getFrom
(
)
.
getId
(
)
,
userName
,
10
)
;
}
BotUtil
.
sendMessage
(
bot
,
message
,
LocalisationService
.
getString
(
"start.welcomeMessage"
)
,
false
,
false
,
KeyboardBuilder
.
inline
(
)
.
button
(
LocalisationService
.
getString
(
"start.buttonCallbackName"
)
,
"getBonus:"
+
message
.
getFrom
(
)
.
getId
(
)
)
.
row
(
)
.
buttonUrl
(
LocalisationService
.
getString
(
"start.buttonUrlName"
)
,
LocalisationService
.
getString
(
"t.me/se1dhe_dev"
)
)
.
build
(
)
)
;
}
}
else
{
if
(
dbUserService
.
findById
(
message
.
getFrom
(
)
.
getId
(
)
)
==
null
)
{
createdAdmin
.
set
(
true
)
;
dbUserService
.
create
(
message
.
getFrom
(
)
.
getId
(
)
,
userName
,
0
)
;
}
BotUtil
.
sendMessage
(
bot
,
message
,
LocalisationService
.
getString
(
"start.welcomeMessage"
)
,
false
,
false
,
KeyboardBuilder
.
inline
(
)
.
button
(
LocalisationService
.
getString
(
"start.buttonCallbackName"
)
,
"getPrize"
)
.
row
(
)
.
buttonUrl
(
LocalisationService
.
getString
(
"start.buttonUrlName"
)
,
LocalisationService
.
getString
(
"start.buttonUrlData"
)
)
.
build
(
)
)
;
}
}


Se1dhe 02.05.2023 20:27

Цитата:

Сообщение от AmaTo

Привет всем. Сделал бота розыграшей, все ок запускается работает, но если выигрывает человек с закрытым профилем, багается конкурс ссылаясь на null профиля человека. Можно ли как то запретить участвовать людям с закрытым профилем или вообще сделать запрет чтобы с закрытым профилем нельзя было вступить в группу?
Цитата:

Сообщение от Спойлер

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Column 'winner_username' cannot be null - тут то понятно что не может записать в бд

Exception in thread "OkHttp Dispatcher" java.lang.NullPointerException


тебе просто нужно брать userName пользователя. Лучше это делать с проверкой, как на примере выше, а именно:

Java:


Код:

String
userName
=
message
.
getFrom
(
)
.
getFirstName
(
)
;
if
(
message
.
getFrom
(
)
.
getUserName
(
)
!=
null
)
{
userName
=
message
.
getFrom
(
)
.
getUserName
(
)
;
}

т.к. не у всех пользователей установлен @userName

Se1dhe 02.05.2023 20:34

Так же, если проводится в группе, то при нажатии на кнопку "участвовать" - нужно проверять юзера на наличие его в бд. если нет - добавлять его в бд и уже после - засовывать его в список участников.


Время: 11:25