Files
SCrawler/SCrawler/Editors/UserCreatorForm.vb
Andy 12c02580f6 2023.11.9.0
ADD MULTI-ACCOUNT

PluginProvider
IDownloadableMedia: added 'AccountName' property
IPluginContentProvider: added 'AccountName' property
ISiteSettings: added properties: 'AccountName', 'Temporary', 'AvailableText', 'DefaultInstance'; added functions: 'Clone', 'Update', 'Delete'; removed 'Load' function; implement 'IDisposable' interface
PropertyValue: added functions: 'BeginInit', 'EndInit', 'Clone'

YT
YouTubeSettings: make the class compatible for multi-acc
YouTubeMediaContainerBase: add 'AccountName' property

SCrawler
IUserData: add properties: 'HostStatic', 'AccountName'
ProfileSaved: add the ability to download saved posts from all accounts
SiteSettingsBase: add multi-acc support; add 'UserOptionsType' for future purposes; update initializers; update responser initializing; add 'CLONE_PROPERTIES' and 'CloneGetEmptySettingsInstance' functions; 'IDisposable' support
UserDataBase: add multi-acc support; change host retrieval method
DomainsContainer: implements 'IDisposable' interface

API.All sites: add multi-acc support; move the Icon and Image setting to the initializer; update initializer
API.Instagram: change some property types
API.Reddit: set 'AvailableText'; update 'UpdateRedGifsToken' and 'UserOptions' functions
API.Mastodon: remove 'MastodonDomains' class and 'SettingsForm' form; replace 'MastodonDomains' with 'DomainsContainer'; update functions 'IsMyUser' and 'IsMyImageVideo'; update to 'DefaultInstance' environment; update 'UserData.ResetCredentials' function
API.XVIDEOS: update to 'DefaultInstance' environment
API.Xhamster: update to 'DefaultInstance' environment

STDownloader: add multi-acc compatibility

SiteEditorForm: add option 'Download saved posts'; update providers; add additional providers; add multi-acc support

PluginsEnvironment: add 'PClonableAttribute'; add multi-acc support
2023-11-12 01:31:09 +03:00

877 lines
48 KiB
VB.net

' Copyright (C) 2023 Andy https://github.com/AAndyProgram
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY
Imports SCrawler.API
Imports SCrawler.API.Base
Imports SCrawler.Plugin
Imports SCrawler.Plugin.Hosts
Imports PersonalUtilities.Tools
Imports PersonalUtilities.Forms
Imports PersonalUtilities.Forms.Controls
Imports PersonalUtilities.Forms.Controls.Base
Imports PersonalUtilities.Functions.RegularExpressions
Imports ADB = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons
Namespace Editors
Friend Class UserCreatorForm
Private WithEvents MyDef As DefaultFormOptions
Friend Property User As UserInfo
Private Property UserInstance As IUserData
Private ReadOnly UserIsCollection As Boolean = False
#Region "User options"
''' <summary>COLLECTION EDITING ONLY</summary>
Friend Property CollectionName As String = String.Empty
Friend Property StartIndex As Integer = -1
Friend ReadOnly Property UserTemporary As Boolean
Get
If CH_FAV.Checked Then
Return False
Else
Return CH_TEMP.Checked
End If
End Get
End Property
Friend ReadOnly Property UserFavorite As Boolean
Get
Return CH_FAV.Checked
End Get
End Property
Friend ReadOnly Property UserMediaOnly As Boolean
Get
Return CH_PARSE_USER_MEDIA.Checked
End Get
End Property
Friend ReadOnly Property UserReady As Boolean
Get
Return CH_READY_FOR_DOWN.Checked
End Get
End Property
Friend ReadOnly Property DownloadImages As Boolean
Get
Return CH_DOWN_IMAGES.Checked
End Get
End Property
Friend ReadOnly Property DownloadVideos As Boolean
Get
Return CH_DOWN_VIDEOS.Checked
End Get
End Property
Friend ReadOnly Property UserDescr As String
Get
Return TXT_DESCR.Text
End Get
End Property
Friend ReadOnly Property UserFriendly As String
Get
Return TXT_USER_FRIENDLY.Text
End Get
End Property
Friend ReadOnly Property ScriptUse As Boolean
Get
Return TXT_SCRIPT.Checked
End Get
End Property
Friend ReadOnly Property ScriptData As String
Get
Return TXT_SCRIPT.Text
End Get
End Property
Friend ReadOnly Property IsSubscription As Boolean
Get
Return CMB_SITE.Checked
End Get
End Property
Private _UserBackColor As Color? = Nothing
Friend ReadOnly Property UserBackColor As Color?
Get
Return _UserBackColor
End Get
End Property
Private _UserForeColor As Color? = Nothing
Friend ReadOnly Property UserForeColor As Color?
Get
Return _UserForeColor
End Get
End Property
Private FriendlyNameIsSiteName As Boolean = False
Private FriendlyNameChanged As Boolean = False
Friend Property Options As String = String.Empty
#End Region
#Region "Exchange, Path, Labels"
Friend Property MyExchangeOptions As Object = Nothing
Private ReadOnly _SpecPathPattern As RParams = RParams.DM("\w:\\.*", 0, EDP.ReturnValue)
Private ReadOnly Property SpecialPath(ByVal s As SettingsHost) As SFile
Get
If TXT_SPEC_FOLDER.IsEmptyString Then
Return Nothing
Else
If Not CStr(RegexReplace(TXT_SPEC_FOLDER.Text, _SpecPathPattern)).IsEmptyString Then
Return $"{TXT_SPEC_FOLDER.Text}\"
Else
Return $"{s.Path.PathWithSeparator}{TXT_SPEC_FOLDER.Text}\"
End If
End If
End Get
End Property
Private SpecialPathHandler As PathMoverHandler = Nothing
Friend ReadOnly Property UserLabels As List(Of String)
Private LabelsIncludeSpecial As Boolean = False
Private LabelsChanged As Boolean = False
#End Region
#Region "Initializers"
''' <summary>Create new user</summary>
Friend Sub New()
InitializeComponent()
UserLabels = New List(Of String)
MyDef = New DefaultFormOptions(Me, Settings.Design)
End Sub
''' <summary>Edit exist user</summary>
Friend Sub New(ByVal _Instance As IUserData)
Me.New
If Not _Instance Is Nothing Then
UserInstance = _Instance
User = DirectCast(UserInstance, UserDataBase).User
UserIsCollection = TypeOf UserInstance Is UserDataBind
If UserIsCollection Then
With DirectCast(UserInstance, UserDataBind) : .CurrentlyEdited = True : CollectionName = .CollectionName : End With
End If
End If
End Sub
#End Region
#Region "Form handlers"
Private Class CollectionNameFieldProvider : Inherits FieldsCheckerProviderBase
Public Overrides Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object
If ACheck(Value) Then
If Settings.Users.Exists(Function(u) u.IsCollection AndAlso u.CollectionName = CStr(Value) AndAlso
Not DirectCast(u, UserDataBind).CurrentlyEdited) Then
ErrorMessage = $"A collection named [{Value}] already exist"
HasError = True
Return Nothing
Else
Return Value
End If
Else
Return Nothing
End If
End Function
End Class
Private Sub UserCreatorForm_Load(sender As Object, e As EventArgs) Handles Me.Load
Try
Dim checkBuffer As Boolean = False
With MyDef
.MyViewInitialize(True)
.AddOkCancelToolbar()
CH_AUTO_DETECT_SITE.Enabled = False
Settings.GlobalLocations.PopulateComboBox(TXT_SPEC_FOLDER)
With CMB_SITE
.BeginUpdate()
.Items.AddRange(Settings.Plugins.Select(Function(p) New ListItem({p.Key, p.Name})))
.EndUpdate(True)
End With
Dim NameFieldProvider As IFormatProvider = Nothing
If UserIsCollection Then
CMB_SITE.CaptionEnabled = False
CMB_SITE.Checked = False
Icon = If(ImageRenderer.GetIcon(My.Resources.DBPic_32, EDP.ReturnValue), Icon)
Text = $"Collection: {UserInstance.CollectionName}"
TXT_USER.CaptionText = "Collection name"
TXT_USER.Text = UserInstance.CollectionName
TXT_USER.Buttons.AddRange({ADB.Refresh, ADB.Clear})
TXT_USER.Buttons.UpdateButtonsPositions()
TXT_SPEC_FOLDER.Buttons.Clear()
TXT_SPEC_FOLDER.Buttons.LeaveDefaultButtons = False
TXT_SPEC_FOLDER.TextBoxReadOnly = True
TXT_SPEC_FOLDER.Buttons.UpdateButtonsPositions()
With TP_MAIN
.Controls.Clear()
.RowStyles.Clear()
.RowCount = 0
With .RowStyles
.Add(New RowStyle(SizeType.Absolute, 28))
.Add(New RowStyle(SizeType.Absolute, 28))
.Add(New RowStyle(SizeType.Absolute, 28))
.Add(New RowStyle(SizeType.Absolute, 28))
.Add(New RowStyle(SizeType.Absolute, 28))
.Add(New RowStyle(SizeType.Absolute, 26))
.Add(New RowStyle(SizeType.Absolute, 26))
.Add(New RowStyle(SizeType.Percent, 100))
End With
.RowCount = .RowStyles.Count
With .Controls
.Add(TXT_USER, 0, 0)
.Add(TXT_SPEC_FOLDER, 0, 1)
.Add(TP_TEMP_FAV, 0, 2)
.Add(TP_DOWN_IMG_VID, 0, 3)
.Add(TP_READY_USERMEDIA, 0, 4)
.Add(TXT_LABELS, 0, 5)
.Add(COLOR_USER, 0, 6)
.Add(TXT_DESCR, 0, 7)
End With
.Refresh()
.Update()
End With
TXT_DESCR.TextBoxReadOnly = True
TXT_DESCR.Buttons.Clear()
TXT_DESCR.Buttons.UpdateButtonsPositions()
CH_TEMP.ThreeState = True
CH_FAV.ThreeState = True
CH_DOWN_IMAGES.ThreeState = True
CH_DOWN_VIDEOS.ThreeState = True
CH_READY_FOR_DOWN.ThreeState = True
CH_PARSE_USER_MEDIA.ThreeState = True
With DirectCast(UserInstance, UserDataBind)
Dim state As Func(Of Boolean, Func(Of IUserData, Boolean, Boolean), CheckState) =
Function(v, p) If(.All(Function(pp) p.Invoke(pp, v)), If(v, CheckState.Checked, CheckState.Unchecked), CheckState.Indeterminate)
TXT_SPEC_FOLDER.Text = DirectCast(.Item(0), UserDataBase).User.SpecialCollectionPath.ToString
CH_TEMP.CheckState = state(.Item(0).Temporary, Function(p, v) p.Temporary = v)
CH_FAV.CheckState = state(.Item(0).Favorite, Function(p, v) p.Favorite = v)
CH_DOWN_IMAGES.CheckState = state(.Item(0).DownloadImages, Function(p, v) p.DownloadImages = v)
CH_DOWN_VIDEOS.CheckState = state(.Item(0).DownloadVideos, Function(p, v) p.DownloadVideos = v)
CH_READY_FOR_DOWN.CheckState = state(.Item(0).ReadyForDownload, Function(p, v) p.ReadyForDownload = v)
CH_PARSE_USER_MEDIA.CheckState = state(.Item(0).ParseUserMediaOnly, Function(p, v) p.ParseUserMediaOnly = v)
_UserBackColor = .BackColor
_UserForeColor = .ForeColor
COLOR_USER.ColorsSetUser(.BackColor, .ForeColor)
TXT_DESCR.Text = .GetUserInformation.StringFormatLines
UpdateSpecificLabels(True)
If .SpecialLabels.ListExists Then TXT_LABELS.Buttons.Insert(0, New ActionButton(ADB.Refresh) With {.ToolTipText = "Show/hide site-specific labels"})
End With
NameFieldProvider = New CollectionNameFieldProvider
Else
If User.Name.IsEmptyString Then
checkBuffer = True
TXT_USER.CaptionText = "User URL"
CH_READY_FOR_DOWN.Checked = True
CH_TEMP.Checked = Settings.DefaultTemporary
CH_DOWN_IMAGES.Checked = Settings.DefaultDownloadImages
CH_DOWN_VIDEOS.Checked = Settings.DefaultDownloadVideos
TXT_SCRIPT.Checked = Settings.ScriptData.Attribute
SetParamsBySite(True)
Else
TP_ADD_BY_LIST.Enabled = False
TXT_USER.Text = User.Name
TXT_SPEC_FOLDER.Text = User.SpecialPath
Dim i% = Settings.Plugins.FindIndex(Function(p) p.Key = User.Plugin)
If i >= 0 Then CMB_SITE.SelectedIndex = i
CMB_SITE.Checked = User.IsSubscription
SetParamsBySite(True)
If i >= 0 Then
With Settings.Plugins(i).Settings
i = .IndexOf(User.AccountName)
If i >= 0 And CMB_ACCOUNT.Items.Count > 0 Then CMB_ACCOUNT.SelectedIndex = i
End With
End If
If Not UserInstance Is Nothing Then
CMB_SITE.Enabled = False
Text = $"User: {UserInstance.Name}"
If Not UserInstance.FriendlyName.IsEmptyString Then Text &= $" ({UserInstance.FriendlyName})"
TXT_USER.Enabled = False
TXT_SPEC_FOLDER.TextBoxReadOnly = True
TXT_SPEC_FOLDER.Buttons.Clear()
TXT_SPEC_FOLDER.Buttons.LeaveDefaultButtons = False
TXT_SPEC_FOLDER.Buttons.UpdateButtonsPositions()
With UserInstance
If .HOST.Key = PathPlugin.PluginKey Then TXT_SPEC_FOLDER.Enabled = False
TXT_USER_FRIENDLY.Text = .FriendlyName
FriendlyNameIsSiteName = DirectCast(.Self, UserDataBase).FriendlyNameIsSiteName
If FriendlyNameIsSiteName Then
With TXT_USER_FRIENDLY
.ControlChangeColor(True, False)
.Buttons.AddRange({New ActionButton With {.Text = "F", .ToolTipText = "Name set by you"},
New ActionButton With {.Text = "S", .ToolTipText = "Name from site"},
New ActionButton(ADB.Clear)})
.ClearTextByButtonClear = False
End With
End If
CH_FAV.Checked = .Favorite
CH_TEMP.Checked = .Temporary
CH_PARSE_USER_MEDIA.Checked = .ParseUserMediaOnly
CH_READY_FOR_DOWN.Checked = .ReadyForDownload
CH_DOWN_IMAGES.Checked = .DownloadImages
CH_DOWN_VIDEOS.Checked = .DownloadVideos
COLOR_USER.ColorsSetUser(.BackColor, .ForeColor)
TXT_SCRIPT.Checked = .ScriptUse
TXT_SCRIPT.Text = .ScriptData
TXT_DESCR.Text = .Description.StringFormatLines
UserLabels.ListAddList(.Labels)
If UserLabels.ListExists Then TXT_LABELS.Text = UserLabels.ListToString
End With
CH_ADD_BY_LIST.Enabled = False
Else
CH_TEMP.Checked = Settings.DefaultTemporary
CH_READY_FOR_DOWN.Checked = Not Settings.DefaultTemporary
CH_DOWN_IMAGES.Checked = Settings.DefaultDownloadImages
CH_DOWN_VIDEOS.Checked = Settings.DefaultDownloadVideos
End If
End If
End If
.MyFieldsChecker = New FieldsChecker
.MyFieldsCheckerE.AddControl(Of String)(TXT_USER, TXT_USER.CaptionText,, NameFieldProvider)
.MyFieldsChecker.EndLoaderOperations()
.EndLoaderOperations()
End With
If checkBuffer Then
Dim tempName$ = BufferText
If Not tempName.IsEmptyString Then
TXT_USER.Text = tempName
If CMB_SITE.SelectedIndex = -1 Then TXT_USER.Text = String.Empty
End If
End If
FriendlyNameChanged = False
Catch ex As Exception
MyDef.InvokeLoaderError(ex)
Finally
LabelsChanged = False
End Try
End Sub
Private Sub UserCreatorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Dim b As Boolean = True
Select Case e.KeyCode
Case Keys.F4 : ChangeLabels()
Case Keys.F2 : If BTT_OTHER_SETTINGS.Enabled Then BTT_OTHER_SETTINGS.PerformClick()
Case Else : b = False
End Select
If b Then e.Handled = True
End Sub
Private Sub UserCreatorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
UserLabels.Clear()
If UserIsCollection And Not UserInstance Is Nothing Then DirectCast(UserInstance, UserDataBind).CurrentlyEdited = False
End Sub
#End Region
#Region "Ok, Cancel"
Private Sub MyDef_ButtonOkClick(ByVal Sender As Object, ByVal e As KeyHandleEventArgs) Handles MyDef.ButtonOkClick
Const msgTitle$ = "Create user"
If UserIsCollection Then
If MyDef.MyFieldsChecker.AllParamsOK Then
With UserInstance
If Not CH_TEMP.CheckState = CheckState.Indeterminate Then .Temporary = CH_TEMP.Checked
If Not CH_FAV.CheckState = CheckState.Indeterminate Then .Favorite = CH_FAV.Checked
If Not CH_DOWN_IMAGES.CheckState = CheckState.Indeterminate Then .DownloadImages = CH_DOWN_IMAGES.Checked
If Not CH_DOWN_VIDEOS.CheckState = CheckState.Indeterminate Then .DownloadVideos = CH_DOWN_VIDEOS.Checked
If Not CH_READY_FOR_DOWN.CheckState = CheckState.Indeterminate Then .ReadyForDownload = CH_READY_FOR_DOWN.Checked
If Not CH_PARSE_USER_MEDIA.CheckState = CheckState.Indeterminate Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
Dim __ubc As Color? = Nothing, __ufc As Color? = Nothing
COLOR_USER.ColorsGetUser(__ubc, __ufc)
Dim __cConv As Func(Of Color?, String) =
Function(__inputColor) If(__inputColor.HasValue, CStr(AConvert(Of String)(__inputColor.Value, String.Empty)), String.Empty)
If Not __cConv(UserBackColor) = __cConv(__ubc) Or Not __cConv(UserForeColor) = __cConv(__ufc) Then
If MsgBoxE({"Are you sure you want to apply the new colors to all users in the collection?", msgTitle}, vbYesNo + vbExclamation) = vbYes Then
.BackColor = __ubc
.ForeColor = __ufc
End If
End If
If LabelsChanged Then _
UserDataBase.UpdateLabels(.Self, UserLabels, 1,
Not DirectCast(.Self, UserDataBase).SpecialLabels.ListExists OrElse
UserDataBase.UpdateLabelsKeepSpecial(1))
CollectionName = TXT_USER.Text
.UpdateUserInformation()
End With
GoTo CloseForm
End If
Else
If Not CH_ADD_BY_LIST.Checked Then
If MyDef.MyFieldsChecker.AllParamsOK Then
Dim s As SettingsHost = Nothing
With GetSiteByCheckers()
If Not .Self Is Nothing Then s = .Self()(CMB_ACCOUNT.Text, True)
End With
If Not s Is Nothing Then
If IsSubscription And Not s.Source.SubscriptionsAllowed Then
MsgBoxE({$"Subscription mode for site [{s.Name}] is not allowed", msgTitle}, vbCritical)
Exit Sub
Else
COLOR_USER.ColorsGetUser(_UserBackColor, _UserForeColor)
Dim tmpUser As UserInfo = User
With tmpUser
.Name = TXT_USER.Text
.Site = s.Name
.Plugin = s.Key
.AccountName = CMB_ACCOUNT.Text
.IsSubscription = IsSubscription
Dim sp As SFile = SpecialPath(s)
If Not sp.IsEmptyString AndAlso Not SpecialPathHandler Is Nothing And UserInstance Is Nothing Then _
sp = SpecialPathHandler.Invoke(.Self, sp)
.SpecialPath = sp
.UpdateUserFile()
End With
User = tmpUser
Dim ScriptText$ = TXT_SCRIPT.Text
If Not ScriptText.IsEmptyString Then
Dim f As SFile = ScriptText
If Not SFile.IsDirectory(ScriptText) And Not UserInstance Is Nothing Then
With DirectCast(UserInstance, UserDataBase) : f.Path = .MyFile.Path : End With
End If
TXT_SCRIPT.Text = f
End If
If Not UserInstance Is Nothing Then
With DirectCast(UserInstance, UserDataBase)
.User = User
Dim setFriendly As Boolean = True
If FriendlyNameIsSiteName Then
If Not FriendlyNameChanged Then
setFriendly = False
Else
setFriendly = MsgBoxE({"Are you sure you want to set the site name as the friendly name?" & vbCr &
$"Friendly name: { .FriendlyNameOrig}" & vbCr &
$"Site name: { .UserSiteName}" & vbCr &
$"Your choice: {TXT_USER_FRIENDLY.Text}", "Friendly name change"}, vbExclamation,,,
{"Confirm", New Messaging.MsgBoxButton("Decline", "Friendly name will not be changed")}) = 0
End If
End If
If setFriendly Then .FriendlyName = TXT_USER_FRIENDLY.Text
.Favorite = CH_FAV.Checked
.Temporary = CH_TEMP.Checked
.ReadyForDownload = CH_READY_FOR_DOWN.Checked
.DownloadImages = CH_DOWN_IMAGES.Checked
.DownloadVideos = CH_DOWN_VIDEOS.Checked
COLOR_USER.ColorsGetUser(.BackColor, .ForeColor)
.UserDescription = TXT_DESCR.Text
If Not MyExchangeOptions Is Nothing Then .ExchangeOptionsSet(MyExchangeOptions)
Dim l As New ListAddParams(LAP.NotContainsOnly + LAP.ClearBeforeAdd)
If .IsCollection Then
With DirectCast(UserInstance, UserDataBind)
If .Count > 0 Then .Collections.ForEach(Sub(c) c.Labels.ListAddList(UserLabels, l))
End With
Else
.Labels.ListAddList(UserLabels, LAP.NotContainsOnly, LAP.ClearBeforeAdd)
End If
.ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
.ScriptUse = TXT_SCRIPT.Checked
.ScriptData = TXT_SCRIPT.Text
.UpdateUserInformation()
End With
End If
GoTo CloseForm
End If
Else
MsgBoxE({"User site not selected", msgTitle}, MsgBoxStyle.Exclamation)
End If
End If
Else
If CreateUsersByList() Then GoTo CloseForm
End If
End If
Exit Sub
CloseForm:
MyDef.CloseForm()
End Sub
Private Sub MyDef_ButtonCancelClick(ByVal Sender As Object, ByVal e As KeyHandleEventArgs) Handles MyDef.ButtonCancelClick
MyDef.CloseForm(IIf(StartIndex >= 0, DialogResult.OK, DialogResult.Cancel))
End Sub
#End Region
#Region "Controls handlers"
Private _TextChangeInvoked As Boolean = False
Private Sub TXT_USER_ActionOnTextChanged(ByVal Sender As Object, ByVal e As EventArgs) Handles TXT_USER.ActionOnTextChanged
Try
If Not _TextChangeInvoked And Not UserIsCollection Then
_TextChangeInvoked = True
Options = String.Empty
If Not CH_ADD_BY_LIST.Checked Then
Dim s As ExchangeOptions = GetSiteByText(TXT_USER.Text)
Dim found As Boolean = False
If Not s.UserName.IsEmptyString Then
Dim i% = Settings.Plugins.FindIndex(Function(p) p.Key = s.HostKey)
If i >= 0 Then
If s.HostKey = PathPlugin.PluginKey Then
TXT_SPEC_FOLDER.Text = s.UserName
s.UserName = s.UserName.CSFileP.Segments.LastOrDefault
End If
CMB_SITE.SelectedIndex = i
TXT_USER.Text = s.UserName
Options = s.Options
found = True
End If
End If
If Not found Then
CMB_SITE.SelectedIndex = -1
CMB_SITE.Clear(ComboBoxExtended.ClearMode.Text)
If Not UserIsCollection Then Icon = My.Resources.UsersIcon_32
End If
End If
_TextChangeInvoked = False
End If
Catch
End Try
End Sub
Private Sub TXT_USER_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_USER.ActionOnButtonClick
If UserIsCollection AndAlso Sender.DefaultButton = ADB.Refresh Then TXT_USER.Text = UserInstance.CollectionName
End Sub
Private Sub TXT_USER_FRIENDLY_ActionOnTextChanged(sender As Object, e As EventArgs) Handles TXT_USER_FRIENDLY.ActionOnTextChanged
If Not MyDef.Initializing Then FriendlyNameChanged = True
End Sub
Private Sub TXT_USER_FRIENDLY_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_USER_FRIENDLY.ActionOnButtonClick
If Sender.DefaultButton = ADB.Clear Then
TXT_USER_FRIENDLY.Clear()
FriendlyNameIsSiteName = False
FriendlyNameChanged = False
TXT_USER_FRIENDLY.ControlChangeColor(SystemColors.Window, SystemColors.WindowText)
Else
Select Case Sender.Text
Case "F"
TXT_USER_FRIENDLY.Text = DirectCast(UserInstance, UserDataBase).FriendlyNameOrig
FriendlyNameIsSiteName = False
FriendlyNameChanged = False
TXT_USER_FRIENDLY.ControlChangeColor(SystemColors.Window, SystemColors.WindowText)
Case "S"
TXT_USER_FRIENDLY.Text = DirectCast(UserInstance, UserDataBase).UserSiteName
FriendlyNameIsSiteName = True
FriendlyNameChanged = False
TXT_USER_FRIENDLY.ControlChangeColor(True, False)
End Select
End If
End Sub
Private Sub CMB_SITE_ActionSelectedItemChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles CMB_SITE.ActionSelectedItemChanged
MyExchangeOptions = Nothing
SetParamsBySite(True)
End Sub
Private Sub CMB_SITE_ActionOnTextChanged(sender As Object, e As EventArgs) Handles CMB_SITE.ActionOnTextChanged
If CMB_SITE.Text.IsEmptyString And Not UserIsCollection Then CMB_SITE.SelectedIndex = -1 : Icon = My.Resources.UsersIcon_32
End Sub
Private Sub BTT_OTHER_SETTINGS_Click(sender As Object, e As EventArgs) Handles BTT_OTHER_SETTINGS.Click
Dim s As SettingsHost = Nothing
With GetSiteByCheckers()
If Not .Self Is Nothing Then s = .Self()(CMB_ACCOUNT.Text, True)
End With
If Not s Is Nothing Then
s.Source.UserOptions(MyExchangeOptions, True)
MyDef.ChangesDetected = True
MyDef.MyOkCancel.EnableOK = True
End If
End Sub
Private Sub TXT_SPEC_FOLDER_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As EventArgs) Handles TXT_SPEC_FOLDER.ActionOnButtonClick
If Sender.DefaultButton = ADB.Open Then
Using ff As New GlobalLocationsChooserForm With {.MyInitialLocation = TXT_SPEC_FOLDER.Text}
ff.ShowDialog()
If ff.DialogResult = DialogResult.OK And Not ff.MyDestination.Path.IsEmptyString Then
Settings.GlobalLocations.PopulateComboBox(TXT_SPEC_FOLDER)
Dim i% = Settings.GlobalLocations.IndexOf(ff.MyDestination)
If i.ValueBetween(0, TXT_SPEC_FOLDER.Count - 1) Then TXT_SPEC_FOLDER.SelectedIndex = i
TXT_SPEC_FOLDER.Text = ff.MyDestination.Path
SpecialPathHandler = ff.MyModelHandler
End If
End Using
End If
End Sub
Private Sub TXT_SPEC_FOLDER_ActionOnTextChanged(sender As Object, e As EventArgs) Handles TXT_SPEC_FOLDER.ActionOnTextChanged
SpecialPathHandler = Nothing
End Sub
Private Sub TXT_SPEC_FOLDER_ActionSelectedItemChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles TXT_SPEC_FOLDER.ActionSelectedItemChanged
Dim i% = TXT_SPEC_FOLDER.SelectedIndex
If i.ValueBetween(0, Settings.GlobalLocations.Count - 1) Then
SpecialPathHandler = GlobalLocationsChooserForm.ModelHandler(Settings.GlobalLocations(i).Model)
Else
SpecialPathHandler = Nothing
End If
End Sub
Private _AccountsRefilling As Boolean = False
Private Sub CMB_ACCOUNT_ActionSelectedItemChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles CMB_ACCOUNT.ActionSelectedItemChanged
If Not _AccountsRefilling Then SetParamsBySite(False)
End Sub
Private Sub CH_TEMP_CheckedChanged(sender As Object, e As EventArgs) Handles CH_TEMP.CheckedChanged
If CH_TEMP.Checked Then CH_FAV.Checked = False : CH_READY_FOR_DOWN.Checked = False
End Sub
Private Sub CH_FAV_CheckedChanged(sender As Object, e As EventArgs) Handles CH_FAV.CheckedChanged
If CH_FAV.Checked Then CH_TEMP.Checked = False
End Sub
Private Sub CH_ADD_BY_LIST_CheckedChanged(sender As Object, e As EventArgs) Handles CH_ADD_BY_LIST.CheckedChanged
If CH_ADD_BY_LIST.Checked Then
TXT_DESCR.GroupBoxText = "Users list"
CH_AUTO_DETECT_SITE.Enabled = True
Else
TXT_DESCR.GroupBoxText = "Description"
CH_AUTO_DETECT_SITE.Checked = False
CH_AUTO_DETECT_SITE.Enabled = False
SetParamsBySite(False)
End If
TXT_USER.Enabled = Not CH_ADD_BY_LIST.Checked
TXT_USER_FRIENDLY.Enabled = Not CH_ADD_BY_LIST.Checked
End Sub
Private Sub CH_AUTO_DETECT_SITE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_AUTO_DETECT_SITE.CheckedChanged
CMB_SITE.Enabled = Not CH_AUTO_DETECT_SITE.Checked
If CH_AUTO_DETECT_SITE.Checked Then
BTT_OTHER_SETTINGS.Enabled = False
MyExchangeOptions = Nothing
Else
BTT_OTHER_SETTINGS.Enabled = True
End If
End Sub
Private Sub TXT_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As EventArgs) Handles TXT_LABELS.ActionOnButtonClick
Select Case Sender.DefaultButton
Case ADB.Open : ChangeLabels()
Case ADB.Clear : UserLabels.Clear() : LabelsChanged = True
Case ADB.Refresh : UpdateSpecificLabels(False)
End Select
End Sub
Private Sub UpdateSpecificLabels(ByVal IsInit As Boolean)
UserLabels.ListAddList(UserInstance.Labels, LAP.NotContainsOnly)
If DirectCast(UserInstance, UserDataBase).SpecialLabels.ListExists Then
If Not IsInit Then LabelsIncludeSpecial = Not LabelsIncludeSpecial
If Not LabelsIncludeSpecial Then UserLabels.ListWithRemove(DirectCast(UserInstance, UserDataBase).SpecialLabels)
If UserLabels.Count > 0 Then UserLabels.Sort()
Else
If Not IsInit Then MsgBoxE({"Users in this collection do not have site-specific labels", "Change labels view"}, vbExclamation)
End If
TXT_LABELS.Clear()
TXT_LABELS.Text = UserLabels.ListToString
End Sub
Private Sub TXT_SCRIPT_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As EventArgs) Handles TXT_SCRIPT.ActionOnButtonClick
SettingsCLS.ScriptTextBoxButtonClick(TXT_SCRIPT, Sender)
End Sub
#End Region
#Region "Functions"
Private Function GetSiteByCheckers() As SettingsHostCollection
Return If(CMB_SITE.SelectedIndex >= 0, Settings(CStr(CMB_SITE.Items(CMB_SITE.SelectedIndex).Value(0))), Nothing)
End Function
Private Function CreateUsersByList() As Boolean
Try
If CH_ADD_BY_LIST.Checked Then
If Not TXT_DESCR.IsEmptyString Then
Dim u As List(Of String) = TXT_DESCR.Text.StringToList(Of String, List(Of String))(vbNewLine).ListForEach(Function(s, ii) s.Trim,, False)
If u.ListExists Then
Dim NonIdentified As New List(Of String)
Dim UsersForCreate As New List(Of UserInfo)
Dim UsersForCreate_Options As New List(Of String)
Dim BannedUsers() As String = Nothing
Dim uu$
Dim ulabels As List(Of String) = ListAddList(Nothing, UserLabels).ListAddValue(LabelsKeeper.NoParsedUser, LAP.NotContainsOnly)
Dim tmpUser As UserInfo
Dim s As SettingsHost = GetSiteByCheckers().Default
Dim sObj As ExchangeOptions = Nothing
Dim Added% = 0
Dim Skipped% = 0
Dim uid%
Dim __getUserSpecialPath As Func(Of UserInfo, SettingsHost, SFile) =
Function(ByVal __user As UserInfo, ByVal __s As SettingsHost) As SFile
Dim sp As SFile = SpecialPath(__s).PathWithSeparator
If sp.IsEmptyString Then
Return Nothing
ElseIf Not SpecialPathHandler Is Nothing Then
Return SpecialPathHandler.Invoke(__user, sp)
Else
Return $"{sp}{__user.Name}\"
End If
End Function
Settings.Labels.Add(LabelsKeeper.NoParsedUser)
For i% = 0 To u.Count - 1
uu = u(i)
If CH_AUTO_DETECT_SITE.Checked Then
sObj = GetSiteByText(uu)
If Not sObj.UserName.IsEmptyString Then
s = Settings(sObj.HostKey).Default
uu = sObj.UserName
Else
s = Nothing
End If
ElseIf i = 0 Then
sObj = GetSiteByText(uu)
End If
If Not s Is Nothing AndAlso (Not IsSubscription OrElse s.Source.SubscriptionsAllowed) Then
tmpUser = New UserInfo(uu, s)
tmpUser.SpecialPath = __getUserSpecialPath(tmpUser, s)
tmpUser.UpdateUserFile()
uid = -1
If Settings.UsersList.Count > 0 Then uid = Settings.UsersList.IndexOf(tmpUser)
If uid < 0 And Not UsersForCreate.Contains(tmpUser) Then
UsersForCreate.Add(tmpUser)
UsersForCreate_Options.Add(sObj.Options)
Else
Skipped += 1
End If
Else
NonIdentified.Add(u(i))
End If
Next
If UsersForCreate.Count > 0 Then
BannedUsers = UserBanned(UsersForCreate.Select(Function(uuu) uuu.Name).ToArray)
If BannedUsers.ListExists Then UsersForCreate.RemoveAll(Function(uuu) BannedUsers.Contains(uuu.Name))
If UsersForCreate.Count > 0 Then
For Each tmpUser In UsersForCreate
Settings.UpdateUsersList(tmpUser)
If StartIndex = -1 Then StartIndex = Settings.Users.Count
Settings.Users.Add(UserDataBase.GetInstance(tmpUser, False))
With Settings.Users.Last
.Options = sObj.Options
.FriendlyName = TXT_USER_FRIENDLY.Text
.Favorite = CH_FAV.Checked
.Temporary = CH_TEMP.Checked
.ReadyForDownload = CH_READY_FOR_DOWN.Checked
.DownloadImages = CH_DOWN_IMAGES.Checked
.DownloadVideos = CH_DOWN_VIDEOS.Checked
.ScriptUse = TXT_SCRIPT.Checked
.Labels.ListAddList(ulabels)
.ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
If Not CH_AUTO_DETECT_SITE.Checked Then _
DirectCast(.Self, UserDataBase).HOST.Source.UserOptions(MyExchangeOptions, False)
DirectCast(.Self, UserDataBase).ExchangeOptionsSet(MyExchangeOptions)
.UpdateUserInformation()
End With
Added += 1
Next
End If
End If
Dim m As New MMessage($"Added {Added} users (skipped (already exists and/or duplicated) {Skipped})")
If BannedUsers.ListExists Or NonIdentified.Count > 0 Then
Dim t$ = String.Empty
If BannedUsers.ListExists Then t.StringAppendLine($"Banned users:{vbNewLine}{BannedUsers.ListToString(vbNewLine)}")
If NonIdentified.Count > 0 Then t.StringAppendLine($"Non-Identified users:{vbNewLine}{NonIdentified.ListToString(vbNewLine)}", vbNewLine.StringDup(2))
m.Style = MsgBoxStyle.Exclamation
m.Text.StringAppendLine("Some of users does not recognized and/or banned")
m.Text.StringAppendLine(t, vbNewLine.StringDup(2))
TXT_DESCR.Text = t
Else
TXT_DESCR.Clear()
End If
MsgBoxE(m)
If Added > 0 Then MyDef.ChangesDetected = False
Return Added > 0 And Not BannedUsers.ListExists And NonIdentified.Count = 0
Else
MsgBoxE("No user can be recognized", MsgBoxStyle.Exclamation)
End If
Else
MsgBoxE("[Users list] is empty", MsgBoxStyle.Critical)
End If
End If
Return False
Catch ex As Exception
Return ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error when adding users by list", False)
End Try
End Function
Private Function GetSiteByText(ByRef TXT As String) As ExchangeOptions
Dim s As ExchangeOptions
For Each p As PluginHost In Settings.Plugins
s = p.Settings.Default.IsMyUser(TXT)
If Not s.UserName.IsEmptyString Then Return s
Next
Return Nothing
End Function
Private Sub SetParamsBySite(ByVal RefillAccs As Boolean)
Dim sc As SettingsHostCollection = GetSiteByCheckers()
Dim s As SettingsHost = Nothing
If Not sc Is Nothing Then
If RefillAccs Then RefillAccounts(sc)
s = sc(CMB_ACCOUNT.Text)
End If
If Not s Is Nothing Then
With s
CH_TEMP.Checked = .Temporary
CH_DOWN_IMAGES.Checked = .DownloadImages
CH_DOWN_VIDEOS.Checked = .DownloadVideos
CH_PARSE_USER_MEDIA.Checked = .GetUserMediaOnly.Value
CH_READY_FOR_DOWN.Checked = Not CH_TEMP.Checked
If s.HasSpecialOptions Then
BTT_OTHER_SETTINGS.Enabled = True
If UserInstance Is Nothing Then
s.Source.UserOptions(MyExchangeOptions, False)
Else
MyExchangeOptions = DirectCast(UserInstance, UserDataBase).ExchangeOptionsGet
End If
Else
BTT_OTHER_SETTINGS.Enabled = False
End If
If Not UserIsCollection Then
If Not s.Source.Icon Is Nothing Then
Icon = s.Source.Icon
ElseIf Not s.Source.Image Is Nothing Then
Icon = ImageRenderer.GetIcon(s.Source.Image, New ErrorsDescriber(False, False, False, My.Resources.UsersIcon_32))
End If
End If
End With
Else
BTT_OTHER_SETTINGS.Enabled = False
If Not UserIsCollection Then Icon = My.Resources.UsersIcon_32
End If
End Sub
Private Sub RefillAccounts(ByVal sc As SettingsHostCollection)
Try
If Not sc Is Nothing And Not UserIsCollection Then
_AccountsRefilling = True
CMB_ACCOUNT.BeginUpdate()
With CMB_ACCOUNT
.BeginUpdate()
.Text = String.Empty
.Items.Clear()
If sc.Count = 1 Then
.Text = SettingsHost.NameAccountNameDefault
.LeaveDefaultButtons = False
.Buttons.Clear()
Else
.LeaveDefaultButtons = True
.Items.AddRange(sc.Select(Function(s) New ListItem(s.AccountName.IfNullOrEmpty(SettingsHost.NameAccountNameDefault))))
End If
.Buttons.UpdateButtonsPositions(True)
.EndUpdate(True)
If .Items.Count > 0 Then
.Enabled = True
.SelectedIndex = 0
Else
.Enabled = False
End If
End With
End If
Catch ex As Exception
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[UserCreatorForm.RefillAccounts]")
Finally
_AccountsRefilling = False
End Try
End Sub
Private Sub ChangeLabels()
Using fl As New LabelsForm(UserLabels)
fl.ShowDialog()
If fl.DialogResult = DialogResult.OK Then
LabelsChanged = True
UserLabels.ListAddList(fl.LabelsList, LAP.NotContainsOnly, LAP.ClearBeforeAdd)
If UserLabels.ListExists Then
UserLabels.Sort()
TXT_LABELS.Text = UserLabels.ListToString
Else
TXT_LABELS.Clear()
End If
End If
End Using
End Sub
#End Region
#Region "TryCreate"
Friend Shared Function TryCreate(ByVal URL As String) As UserCreatorForm
Try
Dim f As New UserCreatorForm
f.UserCreatorForm_Load(f, EventArgs.Empty)
If f.CMB_SITE.SelectedIndex >= 0 Then
f.MyDef.MyOkCancel.BTT_OK.PerformClick()
Return f
Else
f.Dispose()
Return Nothing
End If
Catch ex As Exception
Return ErrorsDescriber.Execute(EDP.SendToLog + EDP.ReturnValue, ex, $"UserCreatorForm.TryCreate({URL})")
End Try
End Function
#End Region
End Class
End Namespace