Conversation Essentials

Conversation Essentials [Paid] 2.8.5

No permission to buy ($45.00)
Does it still happen if this add-on is disabled?

As stock, the "edit conversation" button is always provided for conversation starters to edit the title. This add-on doesn't add any permissions around it to control it.
 
Does it still happen if this add-on is disabled?

As stock, the "edit conversation" button is always provided for conversation starters to edit the title. This add-on doesn't add any permissions around it to control it.
Oh I see. But then what does the Edit Conversation permission do? What i would like to do is to control who can stick/unstick a conversation.


Edit: I also would like to suggest a feature: an option for administrators and moderators to bypass the inbox size limit. I would like to be able to message an user even if he is over the quota.
 
Last edited:
Haven't seen this error before. This is version 2.3.9, so maybe "update" is the only answer I need (I'll be updating today) :)

Code:
Server error log

    Error: Call to a member function hydrateRelation() on null src/addons/SV/ConversationEssentials/XF/Entity/ConversationRecipient.php:199

    Generated by: Member1 Apr 27, 2020 at 10:43 AM

Stack trace

#0 src/addons/SV/ConversationEssentials/XF/Entity/ConversationRecipient.php(285): SV\ConversationEssentials\XF\Entity\ConversationRecipient->getConvEssUserData()
#1 src/XF/Mvc/Entity/Entity.php(1297): SV\ConversationEssentials\XF\Entity\ConversationRecipient->_preSave()
#2 src/XF/Mvc/Entity/Entity.php(1150): XF\Mvc\Entity\Entity->preSave()
#3 src/XF/Repository/Conversation.php(266): XF\Mvc\Entity\Entity->save(true, false)
#4 src/addons/SV/ConversationEssentials/XF/Repository/Conversation.php(262): XF\Repository\Conversation->insertRecipients(Object(SV\ConversationEssentials\XF\Entity\ConversationMaster), Array, Object(SV\ElasticSearchEssentials\XF\Entity\User))
#5 src/XF/Service/Conversation/Inviter.php(115): SV\ConversationEssentials\XF\Repository\Conversation->insertRecipients(Object(SV\ConversationEssentials\XF\Entity\ConversationMaster), Array, Object(SV\ElasticSearchEssentials\XF\Entity\User))
#6 src/addons/SV/ConversationEssentials/XF/Service/Conversation/Inviter.php(15): XF\Service\Conversation\Inviter->_save()
#7 src/XF/Service/ValidateAndSavableTrait.php(40): SV\ConversationEssentials\XF\Service\Conversation\Inviter->_save()
#8 src/XF/Pub/Controller/Conversation.php(814): XF\Service\Conversation\Inviter->save()
#9 src/XF/Mvc/Dispatcher.php(350): XF\Pub\Controller\Conversation->actionInvite(Object(XF\Mvc\ParameterBag))
#10 src/XF/Mvc/Dispatcher.php(257): XF\Mvc\Dispatcher->dispatchClass('XF:Conversation', 'Invite', Object(XF\Mvc\RouteMatch), Object(SV\ConversationEssentials\XF\Pub\Controller\Conversation), NULL)
#11 src/XF/Mvc/Dispatcher.php(113): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(SV\ConversationEssentials\XF\Pub\Controller\Conversation), NULL)
#12 src/XF/Mvc/Dispatcher.php(55): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#13 src/XF/App.php(2184): XF\Mvc\Dispatcher->run()
#14 src/XF.php(391): XF\App->run()
#15 index.php(20): XF::runApp('XF\\Pub\\App')
#16 {main}

Request state

array(4) {
  ["url"] => string(95) "/conversations/conversation.883424/invite"
  ["referrer"] => string(122) "https://www.domain.com/conversations/conversation.883424/"
  ["_GET"] => array(1) {
    ["/conversations/conversation_883424/invite"] => string(0) ""
  }
  ["_POST"] => array(6) {
    ["tokens_select"] => string(8) "Joe Link"
    ["recipients"] => string(8) "Joe Link"
    ["_xfToken"] => string(8) "********"
    ["_xfRequestUri"] => string(89) "/conversations/conversation.883424/"
    ["_xfWithData"] => string(1) "1"
    ["_xfResponseType"] => string(4) "json"
  }
}
 
Hello @Xon one of my members has been trying out the Export Conversations feature but he insists that he is getting errors or blank pages. The following PHP error popped up in my logs. Is there something you recommend to make it work for them? They usually have hundreds if not thousands of conversations so this might be the reason.



XF\Db\Exception: Job SV\ConversationEssentials:ExportConversation: MySQL query error [1406]: Data too long for column 'conversation_ids' at row 1 src/XF/Db/AbstractStatement.php:228

Generated by: Unknown account Apr 30, 2020 at 5:38 PM

Stack trace

INSERT INTO xf_sv_convess_export_log (for_user_id, conversation_ids, export_count, export_format, export_log_id, export_token, export_date, download_count, zip_archive_name, zip_archive_size, zip_archive_path, expired_on) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
------------

#0 src/XF/Db/Mysqli/Statement.php(196): XF\Db\AbstractStatement->getException('MySQL query err...', 1406, '22001')
#1 src/XF/Db/Mysqli/Statement.php(77): XF\Db\Mysqli\Statement->getException('MySQL query err...', 1406, '22001')
#2 src/XF/Db/AbstractAdapter.php(94): XF\Db\Mysqli\Statement->execute()
#3 src/XF/Db/AbstractAdapter.php(221): XF\Db\AbstractAdapter->query('INSERT INTO `x...', Array)
#4 src/XF/Mvc/Entity/Entity.php(1463): XF\Db\AbstractAdapter->insert('xf_sv_convess_e...', Array, false)
#5 src/XF/Mvc/Entity/Entity.php(1195): XF\Mvc\Entity\Entity->_saveToSource()
#6 src/addons/SV/ConversationEssentials/Repository/ConversationExportLog.php(70): XF\Mvc\Entity\Entity->save()
#7 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(774): SV\ConversationEssentials\Repository\ConversationExportLog->log(Object(XF\Mvc\Entity\ArrayCollection), 1699, 'html', Object(SV\ElasticSearchEssentials\XF\Entity\User))
#8 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(733): SV\ConversationEssentials\Service\Conversation\Exporter->log(1699)
#9 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(277): SV\ConversationEssentials\Service\Conversation\Exporter->finalize(1699)
#10 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(291): SV\ConversationEssentials\Job\ExportConversation->finalize()
#11 src/XF/Job/AbstractRebuildJob.php(33): SV\ConversationEssentials\Job\ExportConversation->complete()
#12 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(82): XF\Job\AbstractRebuildJob->run(G)
#13 src/XF/Job/Manager.php(253): SV\ConversationEssentials\Job\ExportConversation->run(G)
#14 src/XF/Job/Manager.php(195): XF\Job\Manager->runJobInternal(Array, G)
#15 src/XF/Job/Manager.php(79): XF\Job\Manager->runJobEntry(Array, G)
#16 job.php(42): XF\Job\Manager->runQueue(false, 8)
#17 {main}
 
Hello @Xon I'm still having issues exporting conversations. Right now my board is logging a lot of errors because of the cron job that exports conversations. The first error was something like this:

League\Flysystem\FileNotFoundException: Job SV\ConversationEssentials:ExportConversation: File not found at path: sv/convess/exported_conversation/Re: Sugerencia (302414) - Professor.txt src/vendor/league/flysystem/src/Filesystem.php:389

Generated by: Unknown account May 10, 2020 at 1:53 PM

Stack trace

#0 src/vendor/league/flysystem/src/Filesystem.php(194): League\Flysystem\Filesystem->assertPresent('sv/convess/expo...')
#1 [internal function]: League\Flysystem\Filesystem->readStream('sv/convess/expo...', Array)
#2 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('parent::readStr...', Array)
#3 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('readStream', Array)
#4 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(154): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('readStream', Array)
#5 src/vendor/league/flysystem/src/MountManager.php(343): League\Flysystem\EventableFilesystem\EventableFilesystem->readStream('sv/convess/expo...')
#6 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(835): League\Flysystem\MountManager->readStream('sv/convess/expo...')
#7 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(727): SV\ConversationEssentials\Service\Conversation\Exporter->addConversationsToZipArchive(Object(PhpZip\ZipFile))
#8 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(277): SV\ConversationEssentials\Service\Conversation\Exporter->finalize(432)
#9 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(291): SV\ConversationEssentials\Job\ExportConversation->finalize()
#10 src/XF/Job/AbstractRebuildJob.php(33): SV\ConversationEssentials\Job\ExportConversation->complete()
#11 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(82): XF\Job\AbstractRebuildJob->run(G)
#12 src/XF/Job/Manager.php(253): SV\ConversationEssentials\Job\ExportConversation->run(G)
#13 src/XF/Job/Manager.php(195): XF\Job\Manager->runJobInternal(Array, G)
#14 src/XF/Job/Manager.php(79): XF\Job\Manager->runJobEntry(Array, G)
#15 job.php(42): XF\Job\Manager->runQueue(false, 8)
#16 {main}

Request state

array(4) {
["url"] => string(8) "/job.php"
["referrer"] => string(24) "https://www.mywebsite.com/"
["_GET"] => array(0) {
}
["_POST"] => array(0) {
}
}

And then the log is being filled with the following error:

TypeError: Argument 1 passed to SV\ConversationEssentials\Service\Conversation\Exporter::getExportFileName() must be an instance of XF\Entity\ConversationMaster, boolean given, called in /home/mywebsite/public_html/src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php on line 345 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php:372

Generated by: Unknown account May 11, 2020 at 9:54 AM

Stack trace

#0 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(345): SV\ConversationEssentials\Service\Conversation\Exporter->getExportFileName(false)
#1 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(734): SV\ConversationEssentials\Service\Conversation\Exporter->getZipArchivePath(Object(SV\ConversationEssentials\Entity\ConversationExportLog))
#2 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(277): SV\ConversationEssentials\Service\Conversation\Exporter->finalize(7)
#3 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(291): SV\ConversationEssentials\Job\ExportConversation->finalize()
#4 src/XF/Job/AbstractRebuildJob.php(33): SV\ConversationEssentials\Job\ExportConversation->complete()
#5 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(82): XF\Job\AbstractRebuildJob->run(G)
#6 src/XF/Job/Manager.php(253): SV\ConversationEssentials\Job\ExportConversation->run(G)
#7 src/XF/Job/Manager.php(195): XF\Job\Manager->runJobInternal(Array, G)
#8 src/XF/Job/Manager.php(79): XF\Job\Manager->runJobEntry(Array, G)
#9 job.php(42): XF\Job\Manager->runQueue(false, 8)
#10 {main}

Request state

array(4) {
["url"] => string(8) "/job.php"
["referrer"] => string(33) "https://www.mywebsite.com/admin.php"
["_GET"] => array(0) {
}
["_POST"] => array(0) {
}
}

I don't know if both errors are related. The errors stopped after I upgraded a different addon (I guess a cache was updated or something) but I have over 4000 errors from the first error to the last one.

Edit: the errors continued to appear in my error logs.
 
Last edited:
It looks like the conversation was deleted in the middle of an export. I'm looking to improve the export feature to be more robust
Thank you Xon,

This new error popped up today in my error log:

XF\Db\DuplicateKeyException: Job SV\ConversationEssentials:ExportConversation: MySQL query error [1062]: Duplicate entry 'V1A2U0' for key 'export_token' src/XF/Db/AbstractStatement.php:228

Generated by: Unknown account May 12, 2020 at 12:54 AM

Stack trace

INSERT INTO xf_sv_convess_export_log (for_user_id, conversation_ids, export_count, export_format, export_log_id, export_token, export_date, download_count, zip_archive_name, zip_archive_size, zip_archive_path, expired_on) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
------------

#0 src/XF/Db/Mysqli/Statement.php(196): XF\Db\AbstractStatement->getException('MySQL query err...', 1062, '23000')
#1 src/XF/Db/Mysqli/Statement.php(77): XF\Db\Mysqli\Statement->getException('MySQL query err...', 1062, '23000')
#2 src/XF/Db/AbstractAdapter.php(94): XF\Db\Mysqli\Statement->execute()
#3 src/XF/Db/AbstractAdapter.php(221): XF\Db\AbstractAdapter->query('INSERT INTO `x...', Array)
#4 src/XF/Mvc/Entity/Entity.php(1463): XF\Db\AbstractAdapter->insert('xf_sv_convess_e...', Array, false)
#5 src/XF/Mvc/Entity/Entity.php(1195): XF\Mvc\Entity\Entity->_saveToSource()
#6 src/addons/SV/ConversationEssentials/Repository/ConversationExportLog.php(70): XF\Mvc\Entity\Entity->save()
#7 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(774): SV\ConversationEssentials\Repository\ConversationExportLog->log(Object(XF\Mvc\Entity\ArrayCollection), 7, 'txt', Object(SV\ElasticSearchEssentials\XF\Entity\User))
#8 src/addons/SV/ConversationEssentials/Service/Conversation/Exporter.php(733): SV\ConversationEssentials\Service\Conversation\Exporter->log(7)
#9 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(277): SV\ConversationEssentials\Service\Conversation\Exporter->finalize(7)
#10 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(291): SV\ConversationEssentials\Job\ExportConversation->finalize()
#11 src/XF/Job/AbstractRebuildJob.php(33): SV\ConversationEssentials\Job\ExportConversation->complete()
#12 src/addons/SV/ConversationEssentials/Job/ExportConversation.php(82): XF\Job\AbstractRebuildJob->run(G)
#13 src/XF/Job/Manager.php(253): SV\ConversationEssentials\Job\ExportConversation->run(G)
#14 src/XF/Job/Manager.php(195): XF\Job\Manager->runJobInternal(Array, G)
#15 src/XF/Job/Manager.php(79): XF\Job\Manager->runJobEntry(Array, G)
#16 job.php(42): XF\Job\Manager->runQueue(false, 8)
#17 {main}

Request state

array(4) {
["url"] => string(8) "/job.php"
["referrer"] => string(44) "https://www.mysite.com/thread/page-254"
["_GET"] => array(0) {
}
["_POST"] => array(0) {
}
}
 
Hi @Xon,

One of my user reported me an issue with my Custom Username Icons add-on.

The log is the following:
ErrorException: Template error: Illegal string offset 'icon' src/addons/XFA/CustomUsernameIcons/XF/Template/Templater.php:77

Generated by: Randomguy May 13, 2020 at 10:13 PM

Stack trace

#0 src/addons/XFA/CustomUsernameIcons/XF/Template/Templater.php(77): XF\Template\Templater->handleTemplateError(2, 'Illegal string ...', '/home/nginx/dom...', 77, Array)
#1 [internal function]: XFA\CustomUsernameIcons\XF\Template\Templater->fnUsernameLink(Object(SV\ConversationEssentials\XF\Template\Templater), false, Object(SV\ElasticSearchEssentials\XF\Entity\User), false, Array)
#2 src/XF/Template/Templater.php(936): call_user_func_array(Array, Array)
#3 internal_data/code_cache/templates/l1/s11/public/conversations_popup.php(32): XF\Template\Templater->func('username_link', Array)
#4 src/XF/Template/Templater.php(701): XF\Template\Templater->{closure}(Object(SV\ConversationEssentials\XF\Template\Templater), Array, Array)
#5 internal_data/code_cache/templates/l1/s11/public/conversations_popup.php(77): XF\Template\Templater->callMacro('conversations_p...', 'popup_item', Array, Array)
#6 src/XF/Template/Templater.php(1315): XF\Template\Templater->{closure}(Object(SV\ConversationEssentials\XF\Template\Templater), Array)
#7 src/addons/AL/ThreadFilter/XF/Template/Templater.php(110): XF\Template\Templater->renderTemplate('conversations_p...', Array, true)
#8 src/XF/Template/Template.php(24): AL\ThreadFilter\XF\Template\Templater->renderTemplate('public:conversa...', Array)
#9 src/XF/Mvc/Renderer/Json.php(84): XF\Template\Template->render()
#10 src/XF/Mvc/Renderer/Json.php(68): XF\Mvc\Renderer\Json->renderHtmlFallback('XF:Conversation...', 'public:conversa...', Array)
#11 src/XF/Mvc/Dispatcher.php(458): XF\Mvc\Renderer\Json->renderView('XF:Conversation...', 'public:conversa...', Array)
#12 src/XF/Mvc/Dispatcher.php(440): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#13 src/XF/Mvc/Dispatcher.php(400): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#14 src/XF/Mvc/Dispatcher.php(58): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'json')
#15 src/XF/App.php(2184): XF\Mvc\Dispatcher->run()
#16 src/XF.php(391): XF\App->run()
#17 index.php(20): XF::runApp('XF\\Pub\\App')
#18 {main}

Request state

array(4) {
["url"] => string(166) "/community/conversations/popup?xfRequestUri=%2Fcommunity%2F&_xfWithData=1&_xfToken=1589425996%2Ce4965d47e6e880f7a2c47615&_xfResponseType=json&=1589666425980"
["referrer"] => string(31) "https://example.com/community/"
["_GET"] => array(6) {
["/community/conversations/popup"] => string(0) ""
["_xfRequestUri"] => string(11) "/community/"
["_xfWithData"] => string(1) "1"
["_xfToken"] => string(43) "1589425996,e49601a4654645680f9aa7a2c47615"
["_xfResponseType"] => string(4) "json"
["_"] => string(13) "158944566980"
}
["_POST"] => array(0) {
}
}

This is apparently happening in your conversation popup.

Do you pass to xf:username a whole fetched User in there ?

Clément
 
The changes Conversation Essentials does to the pop-up are;
Code:
<xf:if is="$xf.options.convess_popup_last_poster_avatar">
   <xf:avatar user="$userConv.Master.LastMessageUser" size="xxs" defaultname="{$userConv.Master.last_message_username}" />
<xf:else />
   <xf:avatar user="$userConv.Master.Starter" size="xxs" defaultname="{$userConv.Master.username}" />
</xf:if>
Both Starter and LastMessageUser can be null if the user in question has been deleted, which is something your add-on needs to handle.
 
Yep it was supposed to, I'll investigate furthermore now that I am sure of the input data. Thanks.
 
  • Like
Reactions: Xon
@Xon

What does this feature do?

Code:
Disallow suppressing alerts from conversation started by
Per user conversation rules have a "Suppress unread alert" option. This global option prevents that from working for conversations started by administrators/moderators/staff/etc
 
Hello there,

I just tried using the "Delete conversation" feature for a user. However, after confirming my action (and receiving the "Your changes have been saved." message), no conversations have been deleted from the database.

The xf_conversation_master table still contains the entry for the conversation started by this particular user and the messages are still there, too.
Do you have the Conversation Essentials' "Prevent conversation hard-delete" option enabled?
 
Do you have the Conversation Essentials' "Prevent conversation hard-delete" option enabled?
Mhmm, no, I have not:
1590742473813.png

But maybe this anyway has to do something with Conversation Essentials, since @Lukas W. doesn't seem to have said problem:
You sure that it isn't just still being processed? It's likely done as a job in the background, as there's potentially no limit of how many conversations there are. I just tried it on my local and my (very limited test) set of conversations is completely gone.

Anyway I think "Prevent conversation hard-delete" should not prevent an admin from using that function via the Admin CP. Does it do this, currently? What is your take on this? @Xon
 
Back
Top Bottom